<!DOCTYPE html>












  


<html class="theme-next gemini use-motion" lang="Chinese">
<head>
  <meta charset="UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=2"/>
<meta name="theme-color" content="#222">












<meta http-equiv="Cache-Control" content="no-transform" />
<meta http-equiv="Cache-Control" content="no-siteapp" />






















<link href="/lib/font-awesome/css/font-awesome.min.css?v=4.6.2" rel="stylesheet" type="text/css" />

<link href="/css/main.css?v=6.4.0" rel="stylesheet" type="text/css" />


  <link rel="apple-touch-icon" sizes="180x180" href="/images/apple-touch-icon-next.png?v=6.4.0">


  <link rel="icon" type="image/png" sizes="32x32" href="/images/favicon-32x32-next.png?v=6.4.0">


  <link rel="icon" type="image/png" sizes="16x16" href="/images/favicon-16x16-next.png?v=6.4.0">


  <link rel="mask-icon" href="/images/logo.svg?v=6.4.0" color="#222">









<script type="text/javascript" id="hexo.configurations">
  var NexT = window.NexT || {};
  var CONFIG = {
    root: '/',
    scheme: 'Gemini',
    version: '6.4.0',
    sidebar: {"position":"left","display":"post","offset":12,"b2t":false,"scrollpercent":false,"onmobile":false},
    fancybox: false,
    fastclick: false,
    lazyload: false,
    tabs: true,
    motion: {"enable":true,"async":false,"transition":{"post_block":"fadeIn","post_header":"slideDownIn","post_body":"slideDownIn","coll_header":"slideLeftIn","sidebar":"slideUpIn"}},
    algolia: {
      applicationID: '',
      apiKey: '',
      indexName: '',
      hits: {"per_page":10},
      labels: {"input_placeholder":"Search for Posts","hits_empty":"We didn't find any results for the search: ${query}","hits_stats":"${hits} results found in ${time} ms"}
    }
  };
</script>


  




  <meta property="og:type" content="website">
<meta property="og:title" content="政子的博客">
<meta property="og:url" content="http://blog.zhengzi.me/page/5/index.html">
<meta property="og:site_name" content="政子的博客">
<meta property="og:locale" content="Chinese">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="政子的博客">






  <link rel="canonical" href="http://blog.zhengzi.me/page/5/"/>



<script type="text/javascript" id="page.configurations">
  CONFIG.page = {
    sidebar: "",
  };
</script>

  <title>政子的博客</title>
  









  <noscript>
  <style type="text/css">
    .use-motion .motion-element,
    .use-motion .brand,
    .use-motion .menu-item,
    .sidebar-inner,
    .use-motion .post-block,
    .use-motion .pagination,
    .use-motion .comments,
    .use-motion .post-header,
    .use-motion .post-body,
    .use-motion .collection-title { opacity: initial; }

    .use-motion .logo,
    .use-motion .site-title,
    .use-motion .site-subtitle {
      opacity: initial;
      top: initial;
    }

    .use-motion {
      .logo-line-before i { left: initial; }
      .logo-line-after i { right: initial; }
    }
  </style>
</noscript>

</head>

<body itemscope itemtype="http://schema.org/WebPage" lang="Chinese">

  
  
    
  

  <div class="container sidebar-position-left 
  page-home">
    <div class="headband"></div>

    <header id="header" class="header" itemscope itemtype="http://schema.org/WPHeader">
      <div class="header-inner"><div class="site-brand-wrapper">
  <div class="site-meta ">
    

    <div class="custom-logo-site-title">
      <a href="/" class="brand" rel="start">
        <span class="logo-line-before"><i></i></span>
        <span class="site-title">政子的博客</span>
        <span class="logo-line-after"><i></i></span>
      </a>
    </div>
    
      
        <p class="site-subtitle">强迫症|学习者|伪文青</p>
      
    
  </div>

  <div class="site-nav-toggle">
    <button aria-label="Toggle navigation bar">
      <span class="btn-bar"></span>
      <span class="btn-bar"></span>
      <span class="btn-bar"></span>
    </button>
  </div>
</div>



<nav class="site-nav">
  
    <ul id="menu" class="menu">
      
        
        
        
          
          <li class="menu-item menu-item-home">
    <a href="/" rel="section">
      <i class="menu-item-icon fa fa-fw fa-home"></i> <br />Home</a>
  </li>
        
        
        
          
          <li class="menu-item menu-item-about">
    <a href="/about/" rel="section">
      <i class="menu-item-icon fa fa-fw fa-user"></i> <br />About</a>
  </li>
        
        
        
          
          <li class="menu-item menu-item-tags">
    <a href="/tags/" rel="section">
      <i class="menu-item-icon fa fa-fw fa-tags"></i> <br />Tags</a>
  </li>
        
        
        
          
          <li class="menu-item menu-item-archives">
    <a href="/archives/" rel="section">
      <i class="menu-item-icon fa fa-fw fa-archive"></i> <br />Archives</a>
  </li>

      
      
    </ul>
  

  

  
</nav>



  



</div>
    </header>

    


    <main id="main" class="main">
      <div class="main-inner">
        <div class="content-wrap">
          
            

          
          <div id="content" class="content">
            
  <section id="posts" class="posts-expand">
    
      

  

  
  
  

  

  <article class="post post-type-normal" itemscope itemtype="http://schema.org/Article">
  
  
  
  <div class="post-block">
    <link itemprop="mainEntityOfPage" href="http://blog.zhengzi.me/2016/09/22/e4-bd-bf-e7-94-a8c-e5-b0-81-e8-a3-85-e4-b8-80-e4-b8-aauwp-e7-9a-84http-get-e5-92-8cpost-e7-9a-84-e7-b1-bb/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="name" content="Jason Bian">
      <meta itemprop="description" content="">
      <meta itemprop="image" content="/images/avatar.jpg">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="政子的博客">
    </span>

    
      <header class="post-header">

        
        
          <h1 class="post-title" itemprop="name headline">
                
                <a class="post-title-link" href="/2016/09/22/e4-bd-bf-e7-94-a8c-e5-b0-81-e8-a3-85-e4-b8-80-e4-b8-aauwp-e7-9a-84http-get-e5-92-8cpost-e7-9a-84-e7-b1-bb/" itemprop="url">
                  使用C#封装一个UWP的HTTP Get和Post的类
                </a>
              
            
          </h1>
        

        <div class="post-meta">
          <span class="post-time">

            
            
            

            
              <span class="post-meta-item-icon">
                <i class="fa fa-calendar-o"></i>
              </span>
              
                <span class="post-meta-item-text">Posted on</span>
              

              
                
              

              <time title="Created: 2016-09-22 14:44:11" itemprop="dateCreated datePublished" datetime="2016-09-22T14:44:11+08:00">2016-09-22</time>
            

            
              

              
                
                <span class="post-meta-divider">|</span>
                

                <span class="post-meta-item-icon">
                  <i class="fa fa-calendar-check-o"></i>
                </span>
                
                  <span class="post-meta-item-text">Edited on</span>
                
                <time title="Modified: 2018-08-21 17:49:42" itemprop="dateModified" datetime="2018-08-21T17:49:42+08:00">2018-08-21</time>
              
            
          </span>

          
            <span class="post-category" >
            
              <span class="post-meta-divider">|</span>
            
              <span class="post-meta-item-icon">
                <i class="fa fa-folder-o"></i>
              </span>
              
                <span class="post-meta-item-text">In</span>
              
              
                <span itemprop="about" itemscope itemtype="http://schema.org/Thing"><a href="/categories/C/" itemprop="url" rel="index"><span itemprop="name">C#</span></a></span>

                
                
                  , 
                
              
                <span itemprop="about" itemscope itemtype="http://schema.org/Thing"><a href="/categories/C/UWP/" itemprop="url" rel="index"><span itemprop="name">UWP</span></a></span>

                
                
              
            </span>
          

          
            
          

          
          

          

          

          

        </div>
      </header>
    

    
    
    
    <div class="post-body" itemprop="articleBody">

      
      

      
        
          
            <h2 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h2><p>HttpWebRequest 是 .net 基类库中的一个类，也在UWP中有所体现。它在命名空间 System.Net之下，可以使用 HTTP 协议和服务器交互。但是UWP中的HttpWebRequest同之前.Net中的还是有一定的区别，少了许多方法。 HttpWebRequest 对 HTTP协议封装的比较完备，可以设置Header和Content，也可以自行设置Cookie。 多数Http访问以Get和Post为主，所以在这里也是对Get和Post两种方法进行封装。</p>
<h2 id="Http-Get"><a href="#Http-Get" class="headerlink" title="Http Get"></a>Http Get</h2><p>要使用Get进行一个链接的访问，最基本的url，Get的参数和网页的编码形式需要以参数形式输入，最终一般只需要拿到返回的Content即可。 以下是实现的代码</p>
<p>   public static async Task<string> HttpGet(string url, string getDataStr = null, string encode = “utf-8”,CookieCollection cc = null) {<br>        //Get方式提交数据只需要在网址后面使用？即可，如果多组数据，需要在提交的时候使用&amp;连接<br>        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url + (getDataStr == null ? “” : “?”) + getDataStr);<br>        //将Cookie写入<br>        request.CookieContainer = new CookieContainer();<br>        if (cc != null) {<br>            request.CookieContainer.Add(new Uri(url), cc);<br>        }<br>        //设置request的方式为GET<br>        request.Method = “GET”;<br>        //设置HTTP头的内容类型,如果需要在Http头中加入其他内容，可以直接使用 request.Headers[“头名称”]=”头内容” 来添加<br>        request.ContentType = “text/html;charset=UTF-8”;<br>        //通过异步方法拿到回应<br>        HttpWebResponse response = (HttpWebResponse)await request.GetResponseAsync();<br>        //写入流<br>        Stream myResponseStream = response.GetResponseStream();<br>        //注册编码转换器（这里同之前WPF开发中不同，需要事先注册编码转换器才能使用）<br>        Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);<br>        //进行内容编码转换<br>        StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding(encode));<br>        //将转换后的内容转化为字符串并返回<br>        string retString = myStreamReader.ReadToEnd();<br>        return retString;<br>    }</string></p>
<h2 id="Http-Post"><a href="#Http-Post" class="headerlink" title="Http Post"></a>Http Post</h2><p>使用Post发送数据时候需要将参数以流的形式写入Request的Header中，其余和Get非常相似。</p>
<pre><code>public static async Task&lt;string&gt; HttpPost(string url, string postDataStr, string encode = &quot;utf-8&quot;, CookieCollection cc = null) {
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
    request.CookieContainer = new CookieContainer();
    if (cc != null) {
        request.CookieContainer.Add(new Uri(url), cc);
    }
    //设置请求方式为POST
    request.Method = &quot;POST&quot;;
    //在POST里一定要注意写入Content—Length，这里的长度是指POST上传的数据的长度，可以使用Encoding中的GetByteCount方法完成
    request.Headers\[&quot;Content-Length&quot;\] = Encoding.UTF8.GetByteCount(postDataStr).ToString();
    //ContentType设置为Web表单模式
    request.ContentType = &quot;application/x-www-form-urlencoded&quot;;

    //test request header
    //request.Accept = &quot;text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8&quot;;
    //request.Headers\[&quot;Accept-Encoding&quot;\] = &quot;gzip, deflate&quot;;
    //request.Headers\[&quot;Accept-Language&quot;\] = &quot;zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3&quot;;
    //request.Headers\[&quot;Connection&quot;\] = &quot;keep-alive&quot;;
    //request.Headers\[&quot;DNT&quot;\] = &quot;1&quot;;
    //request.Headers\[&quot;Host&quot;\] = &quot;10.3.8.211&quot;;
    //request.Headers\[&quot;Referrer&quot;\] = &quot;http://10.3.8.211/&quot;;
    //request.Headers\[&quot;User-Agent&quot;\] = &quot;Mozilla/5.0 (Windows NT 10.0; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0&quot;;

    //拿到request的输入流
    Stream myRequestStream = await request.GetRequestStreamAsync();

    //use this function to register the encoding machine or it will throw expect Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

    //I Don&apos;t know why it doesn&apos;t work, so I use direct function to write
    //StreamWriter myStreamWriter = new StreamWriter(myRequestStream, Encoding.GetEncoding(encode));
    //myStreamWriter.Write(postDataStr);

    //将传输的数据转化为ASCII码写入输入流
    byte\[\] bs = Encoding.ASCII.GetBytes(postDataStr);
    myRequestStream.Write(bs, 0, bs.Length);

    //异步得到Response并且将Response转换为String
    HttpWebResponse response = (HttpWebResponse)await request.GetResponseAsync();
    Stream myResponseStream = response.GetResponseStream();
    StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding(encode));
    string retString = myStreamReader.ReadToEnd();
    return retString;
</code></pre><p>   }</p>
<h2 id="获取文中代码"><a href="#获取文中代码" class="headerlink" title="获取文中代码"></a>获取文中代码</h2><p>在GitHub的HelloBUPT项目中可以得到代码：<a href="https://github.com/imaginezz/helloBUPT/blob/master/beiyou/CommonLibrary/WebLib.cs" target="_blank" rel="noopener">https://github.com/imaginezz/helloBUPT/blob/master/beiyou/CommonLibrary/WebLib.cs</a></p>
<h2 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h2><p>msdn文档：<a href="https://msdn.microsoft.com/zh-cn/library/mt185489.aspx" target="_blank" rel="noopener">https://msdn.microsoft.com/zh-cn/library/mt185489.aspx</a></p>

          
        
      
    </div>

    

    
    
    

    

    

    

    <footer class="post-footer">
      

      

      

      
      
        <div class="post-eof"></div>
      
    </footer>
  </div>
  
  
  
  </article>


    
      

  

  
  
  

  

  <article class="post post-type-normal" itemscope itemtype="http://schema.org/Article">
  
  
  
  <div class="post-block">
    <link itemprop="mainEntityOfPage" href="http://blog.zhengzi.me/2016/09/01/e5-a6-82-e6-9e-9c-e5-bc-b9-e5-b9-95-e4-b8-8d-e6-9b-be-e6-9c-89-e6-b4-be/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="name" content="Jason Bian">
      <meta itemprop="description" content="">
      <meta itemprop="image" content="/images/avatar.jpg">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="政子的博客">
    </span>

    
      <header class="post-header">

        
        
          <h1 class="post-title" itemprop="name headline">
                
                <a class="post-title-link" href="/2016/09/01/e5-a6-82-e6-9e-9c-e5-bc-b9-e5-b9-95-e4-b8-8d-e6-9b-be-e6-9c-89-e6-b4-be/" itemprop="url">
                  如果弹幕不曾有派
                </a>
              
            
          </h1>
        

        <div class="post-meta">
          <span class="post-time">

            
            
            

            
              <span class="post-meta-item-icon">
                <i class="fa fa-calendar-o"></i>
              </span>
              
                <span class="post-meta-item-text">Posted on</span>
              

              
                
              

              <time title="Created: 2016-09-01 12:04:06" itemprop="dateCreated datePublished" datetime="2016-09-01T12:04:06+08:00">2016-09-01</time>
            

            
              

              
                
                <span class="post-meta-divider">|</span>
                

                <span class="post-meta-item-icon">
                  <i class="fa fa-calendar-check-o"></i>
                </span>
                
                  <span class="post-meta-item-text">Edited on</span>
                
                <time title="Modified: 2018-08-21 17:49:42" itemprop="dateModified" datetime="2018-08-21T17:49:42+08:00">2018-08-21</time>
              
            
          </span>

          
            <span class="post-category" >
            
              <span class="post-meta-divider">|</span>
            
              <span class="post-meta-item-icon">
                <i class="fa fa-folder-o"></i>
              </span>
              
                <span class="post-meta-item-text">In</span>
              
              
                <span itemprop="about" itemscope itemtype="http://schema.org/Thing"><a href="/categories/应用/" itemprop="url" rel="index"><span itemprop="name">应用</span></a></span>

                
                
                  , 
                
              
                <span itemprop="about" itemscope itemtype="http://schema.org/Thing"><a href="/categories/应用/随笔/" itemprop="url" rel="index"><span itemprop="name">随笔</span></a></span>

                
                
              
            </span>
          

          
            
          

          
          

          

          

          

        </div>
      </header>
    

    
    
    
    <div class="post-body" itemprop="articleBody">

      
      

      
        
          
            <h2 id="喂，开始行动了"><a href="#喂，开始行动了" class="headerlink" title="喂，开始行动了"></a>喂，开始行动了</h2><p>“喂，子政！我下午要给学弟学妹们办一场讲座，你知道怎么在PPT里播放弹幕码？”惠东急匆匆打来一通电话。”你说的就是像小米发布会那样吧？我还真没研究过。”我摊摊手道。 电话过后，恰赶上北邮MSC举办Hackathon@BPUT。于是我和志龙一拍即合，在MSRA花了一个下午的时间，搞定了弹幕派V0.1。</p>
<h2 id="弹幕从此有了派"><a href="#弹幕从此有了派" class="headerlink" title="弹幕从此有了派"></a>弹幕从此有了派</h2><p>最开始，弹幕派的功能简单到令人发指——扫码打开网页，输入弹幕，点击发送，弹幕就立刻出现在PPT上了。网页没有前端，独有一个输入框；桌面不能更改字体字号，只有一条弹幕轨道。不出意外，它并没有受到评委们的青睐——只是一个自娱自乐的小玩具，没有技术含量，没有商业前景。除了，演示完毕时同学们突如其来的掌声和过后晨曦姐对我们的鼓励。</p>
<h2 id="“我们再改改？”"><a href="#“我们再改改？”" class="headerlink" title="“我们再改改？”"></a>“我们再改改？”</h2><p>冬去春来，志龙和我的聊天记录里最多的就是这句话。由于想要的功能太多，思路三天两头变化，短短三个月，后端代码就重构了两次——从最开始的面向过程，逐渐引入了设计模式。 改变是可以看见的。我们拥有了官方微信号，可以使用微信发送弹幕；我们有了房间管理，可以供多人同时使用；我们有了弹幕控制，UI变得更加Modern；我们的软件走向绿色化，下载就立即可用…… 在我们天马行空的想象中，不断对项目提出新的要求，不断修改提交代码，往复循环，并乐在其中。</p>
<h2 id="用户是动力"><a href="#用户是动力" class="headerlink" title="用户是动力"></a>用户是动力</h2><p>三月里，京城的春花渐次苏醒。弹幕派终于有了自己的网站——<a href="http://www.danmakupie.com，有了自己的新LOGO，有了第一篇帮助文档，有了后台控制面板，也开启了第一轮公测。惠东当然是我们的第一位公测用户。" target="_blank" rel="noopener">www.danmakupie.com，有了自己的新LOGO，有了第一篇帮助文档，有了后台控制面板，也开启了第一轮公测。惠东当然是我们的第一位公测用户。</a> 试用过后，他提出了很多不错的看法和建议，比如弹幕的样式应该和PPT可以有所区分，后台应该可以绑定使用者自己的公众号，用户注册流程不能这么莫名其妙，等等。我们悉数记下，承诺其中大部分问题会在下一个版本中得到解决或者改进。与此同时，也有一些好友通过微信和微博向我们表达了他们的使用感受和改进建议。 我们决定通过OneNote来不断记录用户的建议，找出需要改进的方向并分出优先级，每天花一两个小时来改进我们的程序。我们依旧乐此不疲。就这样，弹幕派在许多用户的指引下，不断引入新功能（和新BUG），不断根据需求调整产品的思路，一路走到了今天。</p>
<h2 id="使命为开源"><a href="#使命为开源" class="headerlink" title="使命为开源"></a>使命为开源</h2><p>派团队没有忘记半年前在Hackathon上我们对于开源的承诺。代码重构完成以后，我们就在GitHub上公开了几乎所有的源代码。我们不仅仅获得了网友Fork和Star，更收获了一批新的用户。 一位广东的同学在GitHub中找到了弹幕派。非常幸运，他成为了弹幕派的第45位用户，也让弹幕派第一次被应用到了实际场景。在他们的职协成果展中，参加的同学使用弹幕派进行留言，并取得了很好的效果。他还为弹幕派找到了一些BUG，并且提供了很多新的建议。 还有一位高中的小弟弟，也通过GitHub找到了弹幕派。别看他年纪不大，代码水平可一点都不差。他告诉我，以前使用GDI+技术实现过类似于我们的弹幕效果，并且在配置不高的电脑上表现不错。他只用了一个下午把他的代码移植到了弹幕派中并提交了Pull Request，我们正在考虑将这些代码变成低配电脑的兼容性模式。</p>
<h2 id="弹幕女神"><a href="#弹幕女神" class="headerlink" title="弹幕女神"></a>弹幕女神</h2><p>20日，5月20日。2016年5月20日下午三点半的前一分钟弹幕派在大创展上同马歆姐和Tracy姐在一起。因为她们，我们会记住这一分钟。从那时开始，弹幕派就和女神密不可分，这是事实，谁也改变不了，因为已经过去了。女神还会到来。 不久之后，弹幕派团队开始扩招。我们从两个人的小工坊变成了十个人的小团队，团队颜值更是提升百倍有余。有了女生的加入，弹幕派的程序员们写Feature，改BUG自然更加给力。 而且~女生们的能力可一点儿都并不比男生差。晓丹从零开始学习，和设计师乐山积极配合，只用了两周的时间，就把我们的主页从原来浓浓的程序员风格改变得轻盈灵动起来（不信？自己去看~）。晓宇更是成为了团队现在的Leader，不论讲技术、带团队还是拼颜值，一样都没有落下！ 现在我们可以自信地说，Pie Team是一支有技术有能力更有颜值的团队！</p>
<h2 id="产品要解决问题"><a href="#产品要解决问题" class="headerlink" title="产品要解决问题"></a>产品要解决问题</h2><p>在信息与通信工程学院毕业晚会的彩排现场，硝烟四起。只是这硝烟不为舞台效果，而是来自一位赞助商。 跟学院沟通确认以后，弹幕派将被用于毕业晚会的现场互动和现场抽奖，除了绑定赞助商的微信号外其余工作都已经准备就绪。直到——赞助商到达现场以后，认为我们的产品不行。因为他们和某微信墙有”公司战略级”的合作，只有那款微信墙才能达到他想要的效果。话还没着地，他就掏出电脑，开始向大家证明。 然后，”咦？这里的文字怎么不能修改？””弹幕派可以呀！””这个背景和你们的PPT风格不搭，你们赶紧给我换PPT””但是弹幕派百搭！””我们要宣传公众号二维码这么小扫不到怎么能行！””弹幕派可以帮你随时放大置顶！”然后，就像我前面铺垫的那样，他只能气呼呼（但是又乖乖地）把公众号绑定到弹幕派上。晚会一切顺利。 如今，我们团队也即将引入一位产品经理，他会以更加深刻的产品思维来定位弹幕派，挖掘用户痛点，让它在竞品中脱颖而出，更精确更直接地解决在多人沟通场景中所遇到的问题。</p>
<h2 id="如果弹幕不曾有派"><a href="#如果弹幕不曾有派" class="headerlink" title="如果弹幕不曾有派"></a>如果弹幕不曾有派</h2><p>如果弹幕不曾有派，志龙就不会在大创展上坦言，虽然他的另一个项目作为明星项目被众多评委青睐，可他还是喜欢待在弹幕派的展位，和俱乐部的同学一起给往来的观众介绍弹幕派。 如果弹幕不曾有派，在毕业晚会上，就不会有王阳带着下一场考试的复习资料面对嘈杂的晚会一面监视着程序一面复习，也不会见证弹幕派第一次在大型晚会上的出色表现。 如果弹幕不曾有派，在新官网上线的那个晚上，我不会和晓宇聊到很晚，我们也不会都兴奋得像小孩子第二天要参加六一演出那样期待菁英计划终期路演，更不会听到邹欣老师引人深思的精彩点评。 如果弹幕不曾有派，我们也就不会相遇，这篇文章也便不复存在。 我们每个人都还在活着，也终会老去，也都在不断地拷问生活的意义。人人都会迷茫，也还有彷徨。我们唯独缺少了为同一个目标努力奋斗的心情，没有了从凌晨遇到一个问题变成去香山赏雪的情景，丢失了一起努力终于改变世界的一丢丢可能性。 但正因为我们在茫茫人海中的相遇，让弹幕终有了派。 我们在这条幽幽小径上如履薄冰地走下去时更会彼此珍惜，彼此支持，续写这篇令人无限遐想的故事。   Pie Team 边子政 写于2016年9月1日凌晨</p>

          
        
      
    </div>

    

    
    
    

    

    

    

    <footer class="post-footer">
      

      

      

      
      
        <div class="post-eof"></div>
      
    </footer>
  </div>
  
  
  
  </article>


    
      

  

  
  
  

  

  <article class="post post-type-normal" itemscope itemtype="http://schema.org/Article">
  
  
  
  <div class="post-block">
    <link itemprop="mainEntityOfPage" href="http://blog.zhengzi.me/2016/08/28/hololens-e5-bc-80-e5-8f-91-e5-88-9d-e4-bd-93-e9-aa-8c/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="name" content="Jason Bian">
      <meta itemprop="description" content="">
      <meta itemprop="image" content="/images/avatar.jpg">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="政子的博客">
    </span>

    
      <header class="post-header">

        
        
          <h1 class="post-title" itemprop="name headline">
                
                <a class="post-title-link" href="/2016/08/28/hololens-e5-bc-80-e5-8f-91-e5-88-9d-e4-bd-93-e9-aa-8c/" itemprop="url">
                  HoloLens开发初体验
                </a>
              
            
          </h1>
        

        <div class="post-meta">
          <span class="post-time">

            
            
            

            
              <span class="post-meta-item-icon">
                <i class="fa fa-calendar-o"></i>
              </span>
              
                <span class="post-meta-item-text">Posted on</span>
              

              
                
              

              <time title="Created: 2016-08-28 01:24:52" itemprop="dateCreated datePublished" datetime="2016-08-28T01:24:52+08:00">2016-08-28</time>
            

            
              

              
                
                <span class="post-meta-divider">|</span>
                

                <span class="post-meta-item-icon">
                  <i class="fa fa-calendar-check-o"></i>
                </span>
                
                  <span class="post-meta-item-text">Edited on</span>
                
                <time title="Modified: 2018-08-21 17:49:42" itemprop="dateModified" datetime="2018-08-21T17:49:42+08:00">2018-08-21</time>
              
            
          </span>

          
            <span class="post-category" >
            
              <span class="post-meta-divider">|</span>
            
              <span class="post-meta-item-icon">
                <i class="fa fa-folder-o"></i>
              </span>
              
                <span class="post-meta-item-text">In</span>
              
              
                <span itemprop="about" itemscope itemtype="http://schema.org/Thing"><a href="/categories/HoloLens/" itemprop="url" rel="index"><span itemprop="name">HoloLens</span></a></span>

                
                
                  , 
                
              
                <span itemprop="about" itemscope itemtype="http://schema.org/Thing"><a href="/categories/HoloLens/Unity/" itemprop="url" rel="index"><span itemprop="name">Unity</span></a></span>

                
                
                  , 
                
              
                <span itemprop="about" itemscope itemtype="http://schema.org/Thing"><a href="/categories/HoloLens/Unity/UWP/" itemprop="url" rel="index"><span itemprop="name">UWP</span></a></span>

                
                
              
            </span>
          

          
            
          

          
          

          

          

          

        </div>
      </header>
    

    
    
    
    <div class="post-body" itemprop="articleBody">

      
      

      
        
          
            <h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p>HoloLens是微软推出的一款增强现实（AR），也有人称之为混合现实（MR）设备。它的技术非常具有革命性，带上它就可以将虚拟世界叠加在现实世界之中，给人们带来虚拟和现实结合的沉浸体验。这样的交互更加自然便捷，很可能会成为几年后一种常见的人机交互方式。 现在已经发售的开发版参数可以在<a href="https://www.microsoft.com/microsoft-hololens/en-us/development-edition" target="_blank" rel="noopener">https://www.microsoft.com/microsoft-hololens/en-us/development-edition</a>中查看，简要说一下，它有64GB Flash存储空间，2GB RAM ，2GB CPU和1GB HPU（我也不知道HPU是什么意思，官网上如是写），大约可以持续使用两三个小时，重量是579g（戴在头上还是有些分量的）。 更多的官方介绍也可以移步HoloLens官网查看<a href="https://www.microsoft.com/microsoft-hololens/en-us" target="_blank" rel="noopener">https://www.microsoft.com/microsoft-hololens/en-us</a>。 在微软学生夏令营上的Hackathon环节中有幸接触到HoloLens，我们希望开发一个类似于Ingress和部落冲突合体的实感游戏，并且可以多玩家互联，让玩家可以体验到兼爱非攻的思维。但是迫于没有Unity开发经验和时间限制（36h），我们就将目标定为一个拾取能量和补充能量的Demo。 在这里总结一下这次HoloLens的大致开发流程，如果没空看这里的瞎扯，请直接看最下面的参考资料，有很多干货和大牛的文章很值得一读。</p>
<h2 id="体验感受"><a href="#体验感受" class="headerlink" title="体验感受"></a>体验感受</h2><p>官方的话说完了，说说我的感受吧。</p>
<p>刚拿到HoloLens的时候就发现了很多它的局限，没有想象中那么好。第一是它的视野有限（比想象中的还要要小很多，就像在眼前加了一台显示器，根本不够用！希望以后的版本可以解决这个问题），第二是计算能力不够（不过缺点也是优点，它是一台完整的PC，不必像其他VR设备那样受到拖线的叨扰），第三是手势输入很困难，现在只有两个手势，一个是只用食指的点按，一个是五指张开的Bloom，交互起来不是很方便。剩下的还有只支持英文，画面深度控制不合理会导致眼睛酸痛，机器太沉等等问题。 不过随着几天的体验，我发现了使用HoloLens的要领——站起来，更要走起来！当你站起来以后会发现整个世界都变了，不再是坐着使用HoloLens那种无感的场景。当你站起来的时候，可以看到所有被你钉在墙上，pin在窗上，甚至浮在空中的窗口，当然你也可以将窗口边走边用手拽到一个合适的地方。现实世界和虚拟世界就这样毫不冲突地结合到了一起，甚至用了一会以后，你会忘记真实世界到底是什么样的，把HoloLens摘掉以后会很不适应无法控制窗口的感觉。交互操作也没有那么不堪，Bloom手势非常漂亮，开始屏幕打开的那一瞬间，简直帅爆了！Cortana的灵敏度也超乎我想象，我可以用我只有六级英语的水平和她轻松对话。最最值得一提的是，当你把一个物体，比如一个飞机模型或者一个地球，甚至整个银河系放置在桌子上的时候，你可以围着它进行360°观察，去看清楚每一个方向的细节，也可以点击某个星球进入那个星球或者将一个飞机放大，让它充满整个屋子。感觉是相当震撼！从来没有一款VR产品可以让我有这么真实但又虚幻的震撼感，HoloLens的确做到了，非常完美！</p>
<h2 id="开发前准备"><a href="#开发前准备" class="headerlink" title="开发前准备"></a>开发前准备</h2><ol>
<li>准备：安装有Windws10的PC，如果需要HoloLens模拟器的话需要4GB以上的内存和支持虚拟化的4核心以上的CPU。</li>
<li>安装Visual Studio 2015：任何版本都可，推荐使用免费的community版本，下载链接 <a href="https://www.visualstudio.com/" target="_blank" rel="noopener">https://www.visualstudio.com/</a></li>
<li>安装Unity For HoloLens：普通的Unity版本是不支持HoloLens相关设置的，需要使用专门为HoloLens定制的Unity版本，下载地址 <a href="http://aka.ms/HoloLensUnity" target="_blank" rel="noopener">http://aka.ms/HoloLensUnity</a></li>
<li>安装 HoloLens Emulator：如果暂时没有HoloLens可以真机调试，可以使用模拟器代为调试，下载地址 <a href="http://go.microsoft.com/fwlink/?LinkID=823018" target="_blank" rel="noopener">http://go.microsoft.com/fwlink/?LinkID=823018</a></li>
</ol>
<p>这次开发的目标是一个3D游戏，所以使用主要使用Unity对游戏进行开发，使用VS对代码进行调试以及传输至HoloLens。</p>
<p>除了使用Unity开发以外，还可以使用DirectX进行开发，或者可以直接将开发好的UWP程序在HoloLens上运行。</p>
<h2 id="开发过程"><a href="#开发过程" class="headerlink" title="开发过程"></a>开发过程</h2><h3 id="在Unity上进行游戏开发"><a href="#在Unity上进行游戏开发" class="headerlink" title="在Unity上进行游戏开发"></a>在Unity上进行游戏开发</h3><p>首先在HoloLens定制版的Unity新建工程，然后需要改一下设置来适应HoloLens。具体可以参考：<a href="https://developer.microsoft.com/zh-cn/windows/holographic/unity_development_overview" target="_blank" rel="noopener">https://developer.microsoft.com/zh-cn/windows/holographic/unity_development_overview</a> 由于事件紧张，所以队友们都是在现学现卖，水平都是一天入门的级别，所以游戏效果并不是很好，就不去贴代码啦~大致的效果就是可以通过点击拾取从空中掉落的能量球并将拾取到的能量提供给自己的能量晶体。</p>
<h3 id="处理游戏与HoloLens的交互"><a href="#处理游戏与HoloLens的交互" class="headerlink" title="处理游戏与HoloLens的交互"></a>处理游戏与HoloLens的交互</h3><p>现在，假装在Unity上模拟器（或者生成exe文件以后）已经可以跑起来啦。但是因为HoloLens的交互方式和普通的鼠标键盘交互有很大的区别，所以我们还需要为HoloLens的交互进行处理。 先来说一下HoloLens交互的主要类型吧，HoloLens提供了下面六组API：</p>
<ul>
<li>世界坐标 <a href="https://dev.windows.com/zh-cn/holographic/coordinate_systems" target="_blank" rel="noopener">World coordinates</a></li>
<li>凝视输入 <a href="https://dev.windows.com/zh-cn/holographic/gaze" target="_blank" rel="noopener">Gaze input</a></li>
<li>手势输入 <a href="https://dev.windows.com/zh-cn/holographic/gestures" target="_blank" rel="noopener">Gesture input</a></li>
<li>声音输入 <a href="https://dev.windows.com/zh-cn/holographic/voice_input" target="_blank" rel="noopener">Voice input</a></li>
<li>空间声音 <a href="https://dev.windows.com/zh-cn/holographic/spatial_sound" target="_blank" rel="noopener">Spatial sound</a></li>
<li>空间匹配 <a href="https://dev.windows.com/zh-cn/holographic/spatial_mapping" target="_blank" rel="noopener">Spatial mapping</a></li>
</ul>
<p>我们这次需要使用的是凝视输入、手势输入和空间匹配。凝视能量球或者能量晶体，然后发射凝视射线，然后检测手势点击，如果检测到跟晶体碰撞并且进行点击，则拾取能量或者补充能量。在放置能量晶体的时候需要扫描整个空间，然后将晶体放置在一个表面上面，在能量球掉落的时候如果掉到地面上就自动消失。 在直接查看官方文档中的API介绍的时候非常晕，也并没有API使用的例子，所以直接参考<a href="https://developer.microsoft.com/zh-cn/windows/holographic/holograms_101" target="_blank" rel="noopener">官网给出的Demo101</a>学习怎么使用这些API。通过阅读源代码并且理解相关含义以后大致明白其思路，并且加到自己代码中实验，发现可以运行。之后我们又发现了更好的办法——直接使用Github上面给出的SDK进行开发，步骤简化了不少，但是因为代码版本不匹配，所以很多库根本无法编译通过，只能删掉之。</p>
<h3 id="在模拟器和真机上进行调试"><a href="#在模拟器和真机上进行调试" class="headerlink" title="在模拟器和真机上进行调试"></a>在模拟器和真机上进行调试</h3><ol>
<li>将Unity工程导出，使用Visua Studio（需要设置为D3D和UAP），使用USB电缆连接HoloLens。（也可以使用WiFi连接，这时需要主机和HoloLens连接到同一个WiFi，在编译选项中的调试设备中选择Remote，按照提示进行）</li>
<li>调整目标设备：在解决方案管理器中右键<strong>Package.appxmanifest</strong> 文件，选择查看代码，找到<strong>TargetDeviceFamily</strong> 标签，将其中的<strong>Name=”Windows.Universal”</strong>改为<strong>Name=”Windows.Holographic”</strong>，将其中的<strong>MaxVersionTested=”10.0.10240.0”</strong>改为<strong>MaxVersionTested=”10.0.10586.0”。</strong></li>
<li>调整编译选项：改变目标为x86（现在只支持x86），并且将生成配置从Debug切换到Release，调试设备选择Device。</li>
<li>点击开始，经过编译和远程部署即可在HoloLens中打开。</li>
<li>具体步骤可以参考：<a href="https://developer.microsoft.com/zh-cn/windows/holographic/holograms_100" target="_blank" rel="noopener">https://developer.microsoft.com/zh-cn/windows/holographic/holograms_100</a></li>
</ol>
<p>除了调试代码以外，还可以使用Device Portal查看HoloLens运行状态并且查看HoloLens中的实时画面。</p>
<ol>
<li>首先在HoloLens的<strong>Settings</strong>中的<strong>Update</strong>里的<strong>For developers</strong>选项中打开Device Portal选项</li>
<li>使用USB或者WiFi连接，如果是USB连接的话，在浏览器里输入<a href="http://127.0.0.1:10080，如果是WiFil连接的话，输入HoloLens的https://" target="_blank" rel="noopener">http://127.0.0.1:10080，如果是WiFil连接的话，输入HoloLens的https://</a>&lt;HoloLens的IP地址&gt;（可以在设置重的网络设置里查看）即可。如果需要安装安全证书则要进行安装。</li>
<li>然后按照提示输入HoloLens里显示的PIN码，然后设置Portal的登陆密码，接下来就可以查看管理HoloLens的各个设置了。</li>
<li>其实Portal也是运用了HoloLens提供的Restful接口进行编写的，所以可以使用HoloLens提供的Restful接口自行提取数据。</li>
</ol>
<ul>
<li>关于设置Portal的方法可以参考：<a href="https://developer.microsoft.com/en-us/windows/holographic/using_the_windows_device_portal" target="_blank" rel="noopener">https://developer.microsoft.com/en-us/windows/holographic/using_the_windows_device_portal</a></li>
<li>关于Restful API可以参考：<a href="https://developer.microsoft.com/en-us/windows/holographic/device_portal_api_reference" target="_blank" rel="noopener">https://developer.microsoft.com/en-us/windows/holographic/device_portal_api_reference</a></li>
</ul>
<h2 id="开发的最终效果"><a href="#开发的最终效果" class="headerlink" title="开发的最终效果"></a>开发的最终效果</h2><p>嗯，不多说了，很多功能都还有BUG，直接上图。 <a href="http://blog.zhengzi.me/wp-content/uploads/2016/08/e1e42585f9ee0d209d54a44e1835aaa9_r.png"><img src="http://blog.zhengzi.me/wp-content/uploads/2016/08/e1e42585f9ee0d209d54a44e1835aaa9_r-1024x575.png" alt="HoloLens效果"></a> 嗯，如果发现这篇文章以后博客停更那一定是被队友打死了。 最后Tip：由于HoloLens的计算能力有限，所以不要放置太复杂的模型上去，否则，后果自负（嗯，其实也没什么后果，就是黑屏而已啦）。 顺便再宣传一下知乎上面的回答吧：<a href="http://zhihu.com/question/31743851/answer/59362202" target="_blank" rel="noopener">参加微软学生夏令营是一种什么样的体验？ - 回答作者: 政子 http://zhihu.com/question/31743851/answer/59362202</a> 这里还有一个自己录制的HoloLens真机使用视频：<a href="http://v.youku.com/v_show/id_XMTcwMjU0NDEwOA==.html?beta&amp;#paction" target="_blank" rel="noopener">http://v.youku.com/v_show/id_XMTcwMjU0NDEwOA==.html?beta&amp;#paction</a></p>
<h2 id="有干货的参考资料"><a href="#有干货的参考资料" class="headerlink" title="有干货的参考资料"></a>有干货的参考资料</h2><ul>
<li>HoloLens官网：<a href="https://www.microsoft.com/microsoft-hololens/en-us" target="_blank" rel="noopener">https://www.microsoft.com/microsoft-hololens/en-us</a>（实用的东西非常多！）</li>
<li>微软学生俱乐部官网微信开发指南：<a href="http://mp.weixin.qq.com/s?__biz=MzA4NzIyMDY0OA==&amp;mid=2655379911&amp;idx=1&amp;sn=723b87293cf14eafa878d72ce80de996&amp;scene=21#wechat_redirect" target="_blank" rel="noopener">第一弹</a> ，<a href="http://mp.weixin.qq.com/s?__biz=MzA4NzIyMDY0OA==&amp;mid=2655379962&amp;idx=1&amp;sn=942e9c182bba77f5c948f38a43d80b12&amp;scene=21#wechat_redirect" target="_blank" rel="noopener">第二弹</a>，<a href="http://mp.weixin.qq.com/s?__biz=MzA4NzIyMDY0OA==&amp;mid=2655379978&amp;idx=1&amp;sn=856278ad56011106a0c214908d7b7ed0&amp;scene=4#wechat_redirect" target="_blank" rel="noopener">第三弹</a> （干货非常多）</li>
<li>MSP的昌伟哥哥的博客：<a href="http://www.cnblogs.com/mantgh/" target="_blank" rel="noopener">http://www.cnblogs.com/mantgh/</a></li>
<li>微软官方示例：<a href="https://developer.microsoft.com/zh-cn/windows/holographic/academy" target="_blank" rel="noopener">https://developer.microsoft.com/zh-cn/windows/holographic/academy</a>（一定要仔细看，跟着一两个例子做完基本就能入门了）</li>
<li>微软官方文档：<a href="https://developer.microsoft.com/zh-cn/windows/holographic/documentation" target="_blank" rel="noopener">https://developer.microsoft.com/zh-cn/windows/holographic/documentation</a>（文档就不是很行，很多地方莫名其妙）</li>
<li>在Unity上HoloLens的开发SDK：<a href="https://github.com/Microsoft/HoloToolkit-Unity" target="_blank" rel="noopener">https://github.com/Microsoft/HoloToolkit-Unity</a> 和 <a href="https://github.com/Microsoft/HoloToolkit" target="_blank" rel="noopener">https://github.com/Microsoft/HoloToolkit</a></li>
<li>HoloLens文档翻译：<a href="https://github.com/HoloDocs/HoloLensDocs" target="_blank" rel="noopener">https://github.com/HoloDocs/HoloLensDocs</a>（这是MSP的昌伟哥哥写的，质量比较高，github上还有很多，也可以参考其他的）</li>
</ul>

          
        
      
    </div>

    

    
    
    

    

    

    

    <footer class="post-footer">
      

      

      

      
      
        <div class="post-eof"></div>
      
    </footer>
  </div>
  
  
  
  </article>


    
      

  

  
  
  

  

  <article class="post post-type-normal" itemscope itemtype="http://schema.org/Article">
  
  
  
  <div class="post-block">
    <link itemprop="mainEntityOfPage" href="http://blog.zhengzi.me/2016/07/29/e4-bd-bf-e7-94-a8scrapy-e5-86-99-e4-b8-aa-e5-a2-9e-e9-87-8f-e5-bc-8f-e5-9b-be-e4-b9-a6-e7-88-ac-e8-99-ab/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="name" content="Jason Bian">
      <meta itemprop="description" content="">
      <meta itemprop="image" content="/images/avatar.jpg">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="政子的博客">
    </span>

    
      <header class="post-header">

        
        
          <h1 class="post-title" itemprop="name headline">
                
                <a class="post-title-link" href="/2016/07/29/e4-bd-bf-e7-94-a8scrapy-e5-86-99-e4-b8-aa-e5-a2-9e-e9-87-8f-e5-bc-8f-e5-9b-be-e4-b9-a6-e7-88-ac-e8-99-ab/" itemprop="url">
                  使用Scrapy写个增量式图书爬虫
                </a>
              
            
          </h1>
        

        <div class="post-meta">
          <span class="post-time">

            
            
            

            
              <span class="post-meta-item-icon">
                <i class="fa fa-calendar-o"></i>
              </span>
              
                <span class="post-meta-item-text">Posted on</span>
              

              
                
              

              <time title="Created: 2016-07-29 21:40:32" itemprop="dateCreated datePublished" datetime="2016-07-29T21:40:32+08:00">2016-07-29</time>
            

            
              

              
                
                <span class="post-meta-divider">|</span>
                

                <span class="post-meta-item-icon">
                  <i class="fa fa-calendar-check-o"></i>
                </span>
                
                  <span class="post-meta-item-text">Edited on</span>
                
                <time title="Modified: 2018-08-21 17:49:42" itemprop="dateModified" datetime="2018-08-21T17:49:42+08:00">2018-08-21</time>
              
            
          </span>

          
            <span class="post-category" >
            
              <span class="post-meta-divider">|</span>
            
              <span class="post-meta-item-icon">
                <i class="fa fa-folder-o"></i>
              </span>
              
                <span class="post-meta-item-text">In</span>
              
              
                <span itemprop="about" itemscope itemtype="http://schema.org/Thing"><a href="/categories/Python/" itemprop="url" rel="index"><span itemprop="name">Python</span></a></span>

                
                
                  , 
                
              
                <span itemprop="about" itemscope itemtype="http://schema.org/Thing"><a href="/categories/Python/爬虫/" itemprop="url" rel="index"><span itemprop="name">爬虫</span></a></span>

                
                
              
            </span>
          

          
            
          

          
          

          

          

          

        </div>
      </header>
    

    
    
    
    <div class="post-body" itemprop="articleBody">

      
      

      
        
          
            <h2 id="需求分析"><a href="#需求分析" class="headerlink" title="需求分析"></a>需求分析</h2><p>爬取图书（特别是小说）数据并存储，用作之后的分析。 可以爬取的站点有Amazon、京东、当当、腾讯旗下的一众小说网站（腾讯文学、创世中文、云起书院）、起点中文网等等。 <a href="http://blog.zhengzi.me/wp-content/uploads/2016/07/爬虫选择.png"><img src="http://blog.zhengzi.me/wp-content/uploads/2016/07/爬虫选择.png" alt="爬虫选择"></a> <a href="http://blog.zhengzi.me/wp-content/uploads/2016/07/爬虫需求.png"><img src="http://blog.zhengzi.me/wp-content/uploads/2016/07/爬虫需求.png" alt="爬虫需求"></a> </p>
<h2 id="爬虫选择"><a href="#爬虫选择" class="headerlink" title="爬虫选择"></a>爬虫选择</h2><p>根据自己熟悉的语言来调查分析网上流行的爬虫。 并最终根据自身情况选择了Scrapy。 <a href="http://blog.zhengzi.me/wp-content/uploads/2016/07/爬虫框架比较.png"><img src="http://blog.zhengzi.me/wp-content/uploads/2016/07/爬虫框架比较.png" alt="爬虫框架比较"></a> <a href="http://blog.zhengzi.me/wp-content/uploads/2016/07/Scrapy.png"><img src="http://blog.zhengzi.me/wp-content/uploads/2016/07/Scrapy.png" alt="Scrapy"></a></p>
<h2 id="以云起书院为例来分析相关网站的模式"><a href="#以云起书院为例来分析相关网站的模式" class="headerlink" title="以云起书院为例来分析相关网站的模式"></a>以云起书院为例来分析相关网站的模式</h2><p><a href="http://blog.zhengzi.me/wp-content/uploads/2016/07/图片1.png"><img src="http://blog.zhengzi.me/wp-content/uploads/2016/07/图片1.png" alt="图片1"></a>根据分析可以看出来，网站的层级有三层：图书列表，图书内容和图书评论。在爬取的时候可以根据三层的内容分别设计Item和数据库并进行爬取和存储。</p>
<h2 id="Scrapy工作方式"><a href="#Scrapy工作方式" class="headerlink" title="Scrapy工作方式"></a>Scrapy工作方式</h2><p><a href="http://blog.zhengzi.me/wp-content/uploads/2016/07/图片2.png"><img src="http://blog.zhengzi.me/wp-content/uploads/2016/07/图片2-1024x877.png" alt="图片2"></a> 有许多地方Scrapy框架都自动完成了，需要做的就是定义要爬取的URL以及将URL里面的内容使用Selector匹配道，在Pipeline中做数据清洗并且将Item里面的内容存入数据库或者文件。</p>
<h2 id="分层增量爬取架构"><a href="#分层增量爬取架构" class="headerlink" title="分层增量爬取架构"></a>分层增量爬取架构</h2><p><a href="http://blog.zhengzi.me/wp-content/uploads/2016/07/图片3.png"><img src="http://blog.zhengzi.me/wp-content/uploads/2016/07/图片3.png" alt="图片3"></a>增量爬取的方法就是分别对每一层写一个Spider，分别进行爬取，爬取之后进行存储并加入标识，之后更新的时候只更新新加入的图书而不去重新将所有的图书重新爬取。</p>
<h2 id="利用Shell指令实现自动增量爬取"><a href="#利用Shell指令实现自动增量爬取" class="headerlink" title="利用Shell指令实现自动增量爬取"></a>利用Shell指令实现自动增量爬取</h2><h3 id="实现爬虫每天自动运行"><a href="#实现爬虫每天自动运行" class="headerlink" title="实现爬虫每天自动运行"></a>实现爬虫每天自动运行</h3><p>//Bash</p>
<p>#crontab – l<br>5 0,12 <em> </em> * /root/cronList.sh</p>
<p>//cronList.sh</p>
<p>#!/bin/bash<br>cd /root/spider/yunqi<br>bash /root/spider/yunqi/run.sh</p>
<h3 id="每次开启任务，按照广度优先进行分层爬取"><a href="#每次开启任务，按照广度优先进行分层爬取" class="headerlink" title="每次开启任务，按照广度优先进行分层爬取"></a>每次开启任务，按照广度优先进行分层爬取</h3><p>//run.sh<br>DATE=$(date +%Y-%m-%d.%H:%M:%S)<br>echo  yunqi Spider Strat $DATE &gt;&gt; log.out<br>scrapy crawl novelList<br>echo yunqi novelList complete &gt;&gt;log.out<br>scrapy crawl novelContent<br>echo yunqi novelContent complete &gt;&gt;log.out<br>scrapy crawl novelComment<br>echo yunqi novelComment complete &gt;&gt;log.out<br>DATE=$(date +%Y-%m-%d.%H:%M:%S)<br>echo  yunqi Spider Finish $DATE &gt;&gt; log.out</p>
<h2 id="运行效果"><a href="#运行效果" class="headerlink" title="运行效果"></a>运行效果</h2><h2 id="后期工作"><a href="#后期工作" class="headerlink" title="后期工作"></a><a href="http://blog.zhengzi.me/wp-content/uploads/2016/07/图片4.png"><img src="http://blog.zhengzi.me/wp-content/uploads/2016/07/图片4.png" alt="图片4"></a>后期工作</h2><p>在爬取之后还应该使用Supervisor或者Scrapyd进行托管，以更稳定的方式运行。之后有空会继续更新一套可视化爬虫工具并开源。</p>
<h2 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h2><ul>
<li>Scrpay文档：<a href="http://doc.scrapy.org/en/1.1/index.html" target="_blank" rel="noopener">http://doc.scrapy.org/en/1.1/index.html</a></li>
<li>Scrapyd文档：<a href="https://scrapyd.readthedocs.io/en/latest/index.html" target="_blank" rel="noopener">https://scrapyd.readthedocs.io/en/latest/index.html</a></li>
<li>Scrpay使用笔记：<a href="http://www.q2zy.com/articles/2015/12/15/note-of-scrapy/" target="_blank" rel="noopener">http://www.q2zy.com/articles/2015/12/15/note-of-scrapy/</a></li>
<li>Scrapy使用以及Xpath的一些坑：<a href="http://www.tuicool.com/articles/EVfqI3" target="_blank" rel="noopener">http://www.tuicool.com/articles/EVfqI3</a></li>
<li>amazon图书爬虫（非增量式，已开源）：<a href="https://github.com/imaginezz/amazonBookSpider" target="_blank" rel="noopener">https://github.com/imaginezz/amazonBookSpider</a></li>
</ul>

          
        
      
    </div>

    

    
    
    

    

    

    

    <footer class="post-footer">
      

      

      

      
      
        <div class="post-eof"></div>
      
    </footer>
  </div>
  
  
  
  </article>


    
      

  

  
  
  

  

  <article class="post post-type-normal" itemscope itemtype="http://schema.org/Article">
  
  
  
  <div class="post-block">
    <link itemprop="mainEntityOfPage" href="http://blog.zhengzi.me/2016/07/18/e4-bd-bf-e7-94-a8azure-e5-bf-ab-e9-80-9f-e6-90-ad-e5-bb-bass-e6-9c-8d-e5-8a-a1-e5-99-a8/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="name" content="Jason Bian">
      <meta itemprop="description" content="">
      <meta itemprop="image" content="/images/avatar.jpg">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="政子的博客">
    </span>

    
      <header class="post-header">

        
        
          <h1 class="post-title" itemprop="name headline">
                
                <a class="post-title-link" href="/2016/07/18/e4-bd-bf-e7-94-a8azure-e5-bf-ab-e9-80-9f-e6-90-ad-e5-bb-bass-e6-9c-8d-e5-8a-a1-e5-99-a8/" itemprop="url">
                  使用Azure快速搭建SS服务器
                </a>
              
            
          </h1>
        

        <div class="post-meta">
          <span class="post-time">

            
            
            

            
              <span class="post-meta-item-icon">
                <i class="fa fa-calendar-o"></i>
              </span>
              
                <span class="post-meta-item-text">Posted on</span>
              

              
                
              

              <time title="Created: 2016-07-18 17:27:46" itemprop="dateCreated datePublished" datetime="2016-07-18T17:27:46+08:00">2016-07-18</time>
            

            
              

              
                
                <span class="post-meta-divider">|</span>
                

                <span class="post-meta-item-icon">
                  <i class="fa fa-calendar-check-o"></i>
                </span>
                
                  <span class="post-meta-item-text">Edited on</span>
                
                <time title="Modified: 2018-08-21 17:49:42" itemprop="dateModified" datetime="2018-08-21T17:49:42+08:00">2018-08-21</time>
              
            
          </span>

          
            <span class="post-category" >
            
              <span class="post-meta-divider">|</span>
            
              <span class="post-meta-item-icon">
                <i class="fa fa-folder-o"></i>
              </span>
              
                <span class="post-meta-item-text">In</span>
              
              
                <span itemprop="about" itemscope itemtype="http://schema.org/Thing"><a href="/categories/VPS/" itemprop="url" rel="index"><span itemprop="name">VPS</span></a></span>

                
                
              
            </span>
          

          
            
          

          
          

          

          

          

        </div>
      </header>
    

    
    
    
    <div class="post-body" itemprop="articleBody">

      
      

      
        
          
            <h2 id="先聊两句"><a href="#先聊两句" class="headerlink" title="先聊两句"></a>先聊两句</h2><p>感谢土豪的微软，前一阵刚拿到了MSDN的订阅，发现其中包含了国际版Azure的订阅，不能浪费，决定来搭建一个ss服务器，方便自己查论文搜代码（简直要开始一本道了hhhhh）。 ss呢，就是大名鼎鼎ShadowSocks的简称，具体情况可以直接搜索，这里就不多说了。我对Python环境比较熟悉，在这里就使用Python版本的SS作为示例。顺便说一下，因为懒得截图，所以我会尽量用文字说清楚每一步，有问题欢迎在文章下面留言讨论。</p>
<h2 id="创建Azure虚拟机环境"><a href="#创建Azure虚拟机环境" class="headerlink" title="创建Azure虚拟机环境"></a>创建Azure虚拟机环境</h2><p>首先登录Azure的Protal（注意是国际版的，国内版的类似，这里不做介绍）：<a href="https://portal.azure.com" target="_blank" rel="noopener">https://portal.azure.com</a> ，接着使用激活了MSDN订阅的微软账户登录，然后就可以看见控制面板了。 接着点击控制面板中的“新建”按钮，之后选择虚拟机。可以弹出一个虚拟机列表，因为我很熟悉CentOS，所以我点击查看全部，然后在应用商店中搜索CentOS，选择了“CentOS-based7.2”，在后面弹出的介绍卡片中选择“创建”，（部署类型选择默认的资源管理器即可）。 不出意外的话，现在会弹出创建虚拟机的选项卡。基本配置中填写名称（虚拟机的名字，随便起一个就行），用户名（用于远程登录的用户名，自己起一个，需要记住），验证类型为了方便选择密码就行，密码（用于远程登录，自己起，需要记住），订阅选择Visual Studio Enterprise（如果有其他可用订阅也可以选择），以前没有建立过资源组的话就新建一个吧（照例名字随便起就可以），最后的位置看心情吧（我也没有测试过到底哪里更快，反正都不在国内可以随便选择，我选择了美国西部）,点击确定继续。 接着进入第二步，选择虚拟机大小，本着省钱的目的（ss服务器也用不了多少资源的），选择A1就可以啦，然后放心进入第三步。 第三步里配置比较麻烦，下面一一叙述。 磁盘类型，选择标准（A1也不让用SSD）。 公共IP地址，在新的卡片里点击新建，创建的时候起一个名字，注意将分配选择静态就好，然后确定。 网络安全组，为了方便我们先允许所有的网络通信，等搭建完毕之后可以再行修改。点击创建网络安全组卡片里的添加入站规则，新的卡片中，先自己起一个名称，优先级填写100（具体规则可以点击小感叹号图标查看），将目标端口改为<em>，剩下的设置不做改动，点击确定。再点击创建网络安全组卡片里的添加出站规则，新的卡片中，先起一个名字，优先级100，再将目标端口范围改成</em>，点击确定即可。然后在创建网络安全组卡片中点击确定。 现在回到设置卡片中，将其余选项保持默认，点击确定。 进入第四步，点击确定即可。然后系统将会开始创建环境（需要等十分钟左右，具体进度可以点击页面右上角的铃铛图标查看）。 创建完成以后，在portal的左栏中选择虚拟机（没有的话点左栏最下面的浏览找一下），选择刚刚创建的虚拟机（显示的就是刚刚起的名字），记下概要中显示的公共IP地址。</p>
<h2 id="远程连接虚拟机"><a href="#远程连接虚拟机" class="headerlink" title="远程连接虚拟机"></a>远程连接虚拟机</h2><p>Windows下推荐使用SecurCRT连接，这里使用SecureCRT为例，如果图方便的话也可以使用Putty，使用方法类似。其余系统可以通过命令行连接。 打开SecureCRT，按Alt+Q打开快速连接，Protocal选择SSH2，Hostname填写刚刚记录下的公共IP地址，Port选择22，Firewall选择None，Username输入创建虚拟机时候第一步自己起的用户名，其余设置保持默认，点击Connect。不出意外的话会弹出对话框让你输入密码，这里的密码也是第一步创建虚拟机时候自己输入的密码，点击ok即可（可以选择Save password复选框记住密码）。现在就已经连接到刚刚在啊azure上面创建的服务器了。</p>
<h2 id="搭建SS服务器"><a href="#搭建SS服务器" class="headerlink" title="搭建SS服务器"></a>搭建SS服务器</h2><p>SS的github地址：<a href="https://github.com/shadowsocks/shadowsocks" target="_blank" rel="noopener">https://github.com/shadowsocks/shadowsocks</a> 进入之后可能会发现啥都没有，别着急，在branch里面选择master，就可以看见所有的代码了。接下来按照readme.md里面的说明安装SS,注意执行一些命令时候需要使用sudo提升权限（可能需要输入密码）。如果执行命令出错很可能是没有使用sudo提权运行。 先安装python的包安装工具pip</p>
<p>sudo yum install python-setuptools<br>sudo easy_install pip</p>
<p>再安装SS</p>
<p>sudo pip install shadowsocks</p>
<p>让SS在后台运行起来</p>
<p>sudo ssserver -p 443 -k password -m aes-256-cfb –user nobody -d start</p>
<p>命令中的-p后的字段是服务的端口号，可以自定义，-k后面的字段是密码，可以自定义，剩下的不需要改动。 后台运行之后可以使用 ps -aux命令查看是否运行成功。</p>
<h3 id="SS开机自启动"><a href="#SS开机自启动" class="headerlink" title="SS开机自启动"></a>SS开机自启动</h3><p>sudo vim /etc/rc.local<br>打开文件以后在exit 0 之前键入<br>sh /usr/bin/python /usr/local/bin/ssserver -p 443 -k password -m aes-256-cfb –user nobody -d start<br>然后按 esc 输入:wq 保存退出，给rc.local可执行权限<br>sudo chmod +x /etc/rc.local</p>
<p>这样，在下次开启的时候，SS就会开机自启动了。</p>
<h2 id="使用Windows的SS客户端连接搭建好的SS服务器"><a href="#使用Windows的SS客户端连接搭建好的SS服务器" class="headerlink" title="使用Windows的SS客户端连接搭建好的SS服务器"></a>使用Windows的SS客户端连接搭建好的SS服务器</h2><p>github地址：<a href="https://github.com/shadowsocks/shadowsocks-windows" target="_blank" rel="noopener">https://github.com/shadowsocks/shadowsocks-windows</a> 下载地址：<a href="https://github.com/shadowsocks/shadowsocks-windows/releases/download/3.0/Shadowsocks-3.0.zip" target="_blank" rel="noopener">https://github.com/shadowsocks/shadowsocks-windows/releases/download/3.0/Shadowsocks-3.0.zip</a>（最新版本为3.0，如果有新版可以在<a href="https://github.com/shadowsocks/shadowsocks-windows/releases页面中下载）" target="_blank" rel="noopener">https://github.com/shadowsocks/shadowsocks-windows/releases页面中下载）</a> 其他系统的客户端可以在<a href="https://github.com/shadowsocks" target="_blank" rel="noopener">https://github.com/shadowsocks</a>中自行查找下载。 下载客户端之后运行，Server IP输入Azure虚拟机的IP，Server Port输入刚刚后台运行SS时候键入的端口号（比如443），Password输入刚刚后台运行SS时输入的密码字段，Encryption选择aes-256-cfb，然后点击左边一栏的Add，再点击OK，不出意外的话SS客户端已经启动成功了。 接下来就是配置浏览器代理了，按按照上面配置好shadowsocks客户端后，点击OK后会最小化到任务栏托盘，此时，右击托盘图标，指向Server，确保勾选的是PAC模式（如果是Global的话是全局模式 PAC则是GFWList智能翻墙模式），然后点击菜单最上面的启用后即可。IE的代理配置会被自动配置好。如果要取消代理，再次点击“启用”即可，此时程序会自动修改系统代理配置，然后就可以通过浏览器自动翻墙了（确保浏览器的代理设置为“系统代理配置”）。如果您装有360等国产流氓软件，请确保把 shadowsocks添加进白名单，不要阻拦其修改网络配置，最好直接将这类软件卸载，换成更加给力的国外软件。 不过我更喜欢浏览器配置代理模式。 firefox上推荐使用插件foxyproxy，具体教程百度上面有很多，可以自行搜索。只是注意G F W L i s t的地址已经换成了<a href="https://raw.githubusercontent.com/gfwlist/gfwlist/master/gfwlist.txt，以前的地址已经失效。" target="_blank" rel="noopener">https://raw.githubusercontent.com/gfwlist/gfwlist/master/gfwlist.txt，以前的地址已经失效。</a> chrome上也可以用foxyproxy插件，配置方法和firefox类似，也可以使用 Proxy SwitchySharp插件，具体配置方法可以自行搜索。 最后填一个坑，配置网络安全组的时候不过滤端口可能会有一些风险，可以根据自己SS配置的端口号适当过滤端口号（但是要保证SSH的22端口可用）。</p>

          
        
      
    </div>

    

    
    
    

    

    

    

    <footer class="post-footer">
      

      

      

      
      
        <div class="post-eof"></div>
      
    </footer>
  </div>
  
  
  
  </article>


    
      

  

  
  
  

  

  <article class="post post-type-normal" itemscope itemtype="http://schema.org/Article">
  
  
  
  <div class="post-block">
    <link itemprop="mainEntityOfPage" href="http://blog.zhengzi.me/2016/06/27/vim-e4-b8-adtab-e5-92-8c4-e4-b8-aa-e7-a9-ba-e6-a0-bc-e4-b9-8b-e9-97-b4-e7-9a-84-e8-bd-ac-e6-8d-a2/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="name" content="Jason Bian">
      <meta itemprop="description" content="">
      <meta itemprop="image" content="/images/avatar.jpg">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="政子的博客">
    </span>

    
      <header class="post-header">

        
        
          <h1 class="post-title" itemprop="name headline">
                
                <a class="post-title-link" href="/2016/06/27/vim-e4-b8-adtab-e5-92-8c4-e4-b8-aa-e7-a9-ba-e6-a0-bc-e4-b9-8b-e9-97-b4-e7-9a-84-e8-bd-ac-e6-8d-a2/" itemprop="url">
                  VIM中tab和4个空格之间的转换
                </a>
              
            
          </h1>
        

        <div class="post-meta">
          <span class="post-time">

            
            
            

            
              <span class="post-meta-item-icon">
                <i class="fa fa-calendar-o"></i>
              </span>
              
                <span class="post-meta-item-text">Posted on</span>
              

              
                
              

              <time title="Created: 2016-06-27 15:02:47" itemprop="dateCreated datePublished" datetime="2016-06-27T15:02:47+08:00">2016-06-27</time>
            

            
              

              
                
                <span class="post-meta-divider">|</span>
                

                <span class="post-meta-item-icon">
                  <i class="fa fa-calendar-check-o"></i>
                </span>
                
                  <span class="post-meta-item-text">Edited on</span>
                
                <time title="Modified: 2018-08-21 17:49:42" itemprop="dateModified" datetime="2018-08-21T17:49:42+08:00">2018-08-21</time>
              
            
          </span>

          
            <span class="post-category" >
            
              <span class="post-meta-divider">|</span>
            
              <span class="post-meta-item-icon">
                <i class="fa fa-folder-o"></i>
              </span>
              
                <span class="post-meta-item-text">In</span>
              
              
                <span itemprop="about" itemscope itemtype="http://schema.org/Thing"><a href="/categories/VIM/" itemprop="url" rel="index"><span itemprop="name">VIM</span></a></span>

                
                
              
            </span>
          

          
            
          

          
          

          

          

          

        </div>
      </header>
    

    
    
    
    <div class="post-body" itemprop="articleBody">

      
      

      
        
          
            <h2 id="在-vimrc文件中转换"><a href="#在-vimrc文件中转换" class="headerlink" title="在.vimrc文件中转换"></a>在.vimrc文件中转换</h2><h3 id="tab转换为4个空格"><a href="#tab转换为4个空格" class="headerlink" title="tab转换为4个空格"></a>tab转换为4个空格</h3><p>在.vimrc中添加以下代码后，重启<strong>vim</strong>即可</p>
<p>set ts=4  (ts是tabstop的缩写，设TAB宽4个空格)<br>set expandtab</p>
<h3 id="4个空格转为tab"><a href="#4个空格转为tab" class="headerlink" title="4个空格转为tab"></a>4个空格转为tab</h3><p>set ts=4  (ts是tabstop的缩写，设TAB宽4个空格)<br>set noexpandtab</p>
<h2 id="已保存文件的转换"><a href="#已保存文件的转换" class="headerlink" title="已保存文件的转换"></a>已保存文件的转换</h2><h3 id="tab转换为4个空格-1"><a href="#tab转换为4个空格-1" class="headerlink" title="tab转换为4个空格"></a>tab转换为4个空格</h3><p>:set ts=4<br>:set expandtab<br>:%retab!</p>
<h3 id="4个空格转为tab-1"><a href="#4个空格转为tab-1" class="headerlink" title="4个空格转为tab"></a>4个空格转为tab</h3><p>:set ts=4<br>:set noexpandtab<br>:%retab!</p>
<p>注意：加!是用于处理非空白字符之后的TAB，即所有的TAB，若不加!，则只处理行首的TAB。</p>

          
        
      
    </div>

    

    
    
    

    

    

    

    <footer class="post-footer">
      

      

      

      
      
        <div class="post-eof"></div>
      
    </footer>
  </div>
  
  
  
  </article>


    
      

  

  
  
  

  

  <article class="post post-type-normal" itemscope itemtype="http://schema.org/Article">
  
  
  
  <div class="post-block">
    <link itemprop="mainEntityOfPage" href="http://blog.zhengzi.me/2016/06/16/e5-85-a8-e7-90-83-e5-8f-98-e5-86-b7/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="name" content="Jason Bian">
      <meta itemprop="description" content="">
      <meta itemprop="image" content="/images/avatar.jpg">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="政子的博客">
    </span>

    
      <header class="post-header">

        
        
          <h1 class="post-title" itemprop="name headline">
                
                <a class="post-title-link" href="/2016/06/16/e5-85-a8-e7-90-83-e5-8f-98-e5-86-b7/" itemprop="url">
                  遗忘
                </a>
              
            
          </h1>
        

        <div class="post-meta">
          <span class="post-time">

            
            
            

            
              <span class="post-meta-item-icon">
                <i class="fa fa-calendar-o"></i>
              </span>
              
                <span class="post-meta-item-text">Posted on</span>
              

              
                
              

              <time title="Created: 2016-06-16 02:05:30" itemprop="dateCreated datePublished" datetime="2016-06-16T02:05:30+08:00">2016-06-16</time>
            

            
              

              
                
                <span class="post-meta-divider">|</span>
                

                <span class="post-meta-item-icon">
                  <i class="fa fa-calendar-check-o"></i>
                </span>
                
                  <span class="post-meta-item-text">Edited on</span>
                
                <time title="Modified: 2018-08-21 17:49:42" itemprop="dateModified" datetime="2018-08-21T17:49:42+08:00">2018-08-21</time>
              
            
          </span>

          
            <span class="post-category" >
            
              <span class="post-meta-divider">|</span>
            
              <span class="post-meta-item-icon">
                <i class="fa fa-folder-o"></i>
              </span>
              
                <span class="post-meta-item-text">In</span>
              
              
                <span itemprop="about" itemscope itemtype="http://schema.org/Thing"><a href="/categories/随笔/" itemprop="url" rel="index"><span itemprop="name">随笔</span></a></span>

                
                
              
            </span>
          

          
            
          

          
          

          

          

          

        </div>
      </header>
    

    
    
    
    <div class="post-body" itemprop="articleBody">

      
      

      
        
          
            <p>一个处处冷光的陌生城市，开始落雨 走在路上望着街景，却看不见他人的脸庞 轻叹一声，信手将雨伞放在喷泉台上   老钟刚迎上十二点，放弃了挣扎，就在开始沉吟的一刹 我浑身湿透，仿佛情绪被无限放大 狂笑，大怒，放肆，高声讲话 雨从眉心划下，我再也顾不得眼镜是不是还需要擦 我变得狂喜，也想要怒骂 祈求，捶打，狂乱，加快步伐   闪电彻亮了整个天宿 我心中的情绪一点点地起幕 我感受到了陷入爱情时的疯狂专注 我感受到了陷入绝望时的出离孤独   此刻大脑不再疯狂幻想 眼前也不再是往常那一幅幅的抽象 我的呼吸开始急促，主角仿佛已经登场 我赤身于真空，情绪开始无限制加强   我疯狂地远游，疯狂地追求 我疯狂地拥有，疯狂地腐朽 我疯狂地做爱，疯狂地期待 我疯狂地忍耐，疯狂地释怀   我开始疯狂地感受她的每一寸肌肤，疯狂地记忆一起经历的每一个细节 也疯狂地写作一首首媚俗的小诗，疯狂地收集每一刻钟繁复的情绪   冷风中走来一个身影伴着俊俏 她撑伞走到我的面前，我机械地接过伞柄，打的高高 简单的拥抱之后，手被手牵起 我什么都做不了，只能去思考 我听见钟表，指针走向十二点整，滴滴答答一秒一秒 我睁开双眼，她的脸庞，却怎么也寻找不到   就这样 伫立几分钟后，我撑伞走开 老钟没再发出声响，不觉中我已经被它遗忘</p>

          
        
      
    </div>

    

    
    
    

    

    

    

    <footer class="post-footer">
      

      

      

      
      
        <div class="post-eof"></div>
      
    </footer>
  </div>
  
  
  
  </article>


    
      

  

  
  
  

  

  <article class="post post-type-normal" itemscope itemtype="http://schema.org/Article">
  
  
  
  <div class="post-block">
    <link itemprop="mainEntityOfPage" href="http://blog.zhengzi.me/2016/06/02/e6-95-b0-e6-8d-ae-e6-8c-96-e6-8e-98-e5-9f-ba-e6-9c-ac-e6-a6-82-e5-bf-b5-e6-a1-86-e6-9e-b6-2/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="name" content="Jason Bian">
      <meta itemprop="description" content="">
      <meta itemprop="image" content="/images/avatar.jpg">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="政子的博客">
    </span>

    
      <header class="post-header">

        
        
          <h1 class="post-title" itemprop="name headline">
                
                <a class="post-title-link" href="/2016/06/02/e6-95-b0-e6-8d-ae-e6-8c-96-e6-8e-98-e5-9f-ba-e6-9c-ac-e6-a6-82-e5-bf-b5-e6-a1-86-e6-9e-b6-2/" itemprop="url">
                  数据挖掘基本概念框架
                </a>
              
            
          </h1>
        

        <div class="post-meta">
          <span class="post-time">

            
            
            

            
              <span class="post-meta-item-icon">
                <i class="fa fa-calendar-o"></i>
              </span>
              
                <span class="post-meta-item-text">Posted on</span>
              

              
                
              

              <time title="Created: 2016-06-02 00:35:20" itemprop="dateCreated datePublished" datetime="2016-06-02T00:35:20+08:00">2016-06-02</time>
            

            
              

              
                
                <span class="post-meta-divider">|</span>
                

                <span class="post-meta-item-icon">
                  <i class="fa fa-calendar-check-o"></i>
                </span>
                
                  <span class="post-meta-item-text">Edited on</span>
                
                <time title="Modified: 2018-08-21 17:49:42" itemprop="dateModified" datetime="2018-08-21T17:49:42+08:00">2018-08-21</time>
              
            
          </span>

          
            <span class="post-category" >
            
              <span class="post-meta-divider">|</span>
            
              <span class="post-meta-item-icon">
                <i class="fa fa-folder-o"></i>
              </span>
              
                <span class="post-meta-item-text">In</span>
              
              
                <span itemprop="about" itemscope itemtype="http://schema.org/Thing"><a href="/categories/数据挖掘/" itemprop="url" rel="index"><span itemprop="name">数据挖掘</span></a></span>

                
                
              
            </span>
          

          
            
          

          
          

          

          

          

        </div>
      </header>
    

    
    
    
    <div class="post-body" itemprop="articleBody">

      
      

      
        
          
            <p>1.认识 数据挖掘类似挖矿–&gt;找出事先不知道的潜在的有用知识 更多是要挖掘出模式，而不只是知识，所以数据挖掘–&gt;机器学习 过程：数据–清洗–集成–选择（指标、算法模型）–找到知识 与统计学：</p>
<p>关系：统计学与数据挖掘目标类似，方法类似（回归、聚类、分类等等）；</p>
<p>区别：统计学：统计分析建模；数据挖掘：融合计算机</p>
<p>与数据分析：</p>
<p>分析：假设–验证假设</p>
<p>挖掘：事先不知道假设（发现驱动），前提是有充分的数据分析，所以是包含关系</p>
<p>与机器学习：</p>
<p>机器学习：不仅包含数据挖掘，还有统计学、模式识别、自然语言处理；可以自动学习新知识</p>
<p>数据挖掘：不具有自动学习的功能，它是机器学习的一些方法，只是从历史数据挖掘出一些模式</p>
<p>流程：CRISP-DM</p>
<p>商业理解-数据理解-数据准备-建立模型-数据评估-发布</p>
<p>商业理解：从商业角度理解项目的目标和要求（类似需求分析）</p>
<p>数据理解：数据质量检查、数据探索、找出分布和基本统计量（知道数据长什么样和一些规则）</p>
<p>数据准备：样本和属性选择，按照建模工具要求对数据转换和清洗</p>
<p>建模：模型选择和参数调优</p>
<p>评估：模型是否满足商业目标，分析时一些问题是不是没有考虑到，结果的使用范围</p>
<p>发布：根据项目的建设目标进行发布，软件集成和报告</p>
<p>2.算法</p>
<p>监督性学习算法</p>
<p>分类</p>
<p>预测分类标号（离散取值）</p>
<p>根据数据集合标签模型，构建模型分类现有数据，并用生成的模型对新数据分类</p>
<p>流程</p>
<p>建立模型：描述预定数据类集合概念集</p>
<p>训练样本，测试样本</p>
<p>使用模型：将未来或未知的对象进行分类</p>
<p>首先进行评估，常用指标包括准确率和召回率</p>
<p>要注意：训练和测试的样本需要完全分离，否则会造成波动拟合的问题</p>
<p>算法</p>
<p>决策树算法</p>
<p>模拟人类识别的问题</p>
<p>每个树节点可以是叶节点，对应某一类，也可以对应一个划分</p>
<p>将样本进行自上而下分而治之</p>
<p>包含C4.5算法和C5.0算法</p>
<p>核心是在决策树各级节点上选择属性，使得在每个非叶子节点上进行测试时，能获得被测试例子最大的类别信息</p>
<p>选择方法有两种：</p>
<p>C4.5：信息增益，所有的指标都是离散的</p>
<p>C5.0：信息增益率，既可以适用于离散，也可以适用于连续，为了避免属性选择不准</p>
<p>构造方法：</p>
<p>计算信息量、计算信息期望、计算信息增益</p>
<p>使用过程：训练过程–测试过程</p>
<p>剪枝——提出无关紧要的分枝</p>
<p>贝叶斯分类法</p>
<p>用贝叶斯定律预测类成员的概率，给定类成员相关属性，计算该成员属于某类别的相关概率（后验概率）</p>
<p>前提是假设每个属性都相互独立，假设每个属性对类别产生的影响都是等价的（朴素贝叶斯算法）</p>
<p>网络贝叶斯算法：考虑属性之间的相关性（使用比较多）</p>
<p>难点：需要概率的初始知识，或者一些背景知识；计算代价比较大</p>
<p>Logistic回归算法：</p>
<p>研究观测结果为分类变量与响应因素之间的回归关系的多因素统计分析算法</p>
<p>通过计算因变量对目标变量的影响，分析目标变量的归类</p>
<p>二分类回归、多分类回归（转化为二分类问题，进行组合）</p>
<p>是神经网络和深度学习的核心算法</p>
<p>分为一元和多元的逻辑回归</p>
<p>参数确定：</p>
<p>最大似然估计法，梯度下降法、EM算法</p>
<p>KNN算法：（很少用）</p>
<p>K最近邻算法，最简单的算法之一，不需要训练可以直接计算，但输出的结果解释性不强</p>
<p>如果一个样本在特征空间中的K个最相似的样本中的大多数属于某一个类别，则该样本也属于这个类别</p>
<p>前提：所选的邻居样本已经正确分类</p>
<p>核心思想：计算样本之间的距离：如欧氏距离、马氏距离等</p>
<p>其他算法：SVM、神经网络</p>
<p>预测</p>
<p>构造和使用模型评估无样本类，或评估给定样本可能的属性和值空间</p>
<p>目标变量连续</p>
<p>预测空缺值和价格等等</p>
<p>算法</p>
<p>回归预测算法</p>
<p>线性回归</p>
<p>多元回归</p>
<p>非线性回归</p>
<p>模型评估</p>
<p>指标：准确率、召回率、平均绝对误差等</p>
<p>分类：</p>
<p>保持方法</p>
<p>将给定数据划分为两个数据集合：训练集（2/3）和测试集（1/3）–&gt;严格来说，还会有验证集，用来调参</p>
<p>随机子选样方法</p>
<p>将保持方法重复k次，选取指标的平均值作为最终的评估结果</p>
<p>比保持方法更科学</p>
<p>k-折交叉确认</p>
<p>将数据分为k个分类，一定比例选择测试集和训练集，不断迭代</p>
<p>无监督性学习算法</p>
<p>有监督学习算法有类标签，无监督学习算法没有类标签（不知道属于哪一类）</p>
<p>聚类算法</p>
<p>同一个类中样本相似度最大，不同类中样本差异度最大</p>
<p>K-Means算法（k-均值聚类）</p>
<p>以最小化误差函数为基础</p>
<p>需要定义聚类数目、迭代次数或者收敛条件，并指定K个中心点，根据一定的相似性度量准则进行聚类，反复迭代</p>
<p>降维算法</p>
<p>将几千个特征压缩为若干特征，去除冗余信息，减少特征数量，提高算法性能，便于可视化</p>
<p>PCA算法（分解矩阵）、SVD算法（分解矩阵）、张量分解算法（更高维度分解）–&gt;将数据压缩成少数几个维度</p>
<p>特殊算法</p>
<p>智能推荐算法</p>
<p>和搜索引擎</p>
<p>相同：帮助用户快速发现有用信息</p>
<p>不同：搜索引擎需要用户主动获取关键词；推荐算法不需要用户明确提出需求，而是分析历史行为</p>
<p>两者是互补关系</p>
<p>算法</p>
<p>关联规则算法</p>
<p>从信息存储中发现有趣的隐藏的频繁出现的模式</p>
<p>算法：Apriori算法等</p>
<p>计算支持度和置信度，指定阈值，生成规则</p>
<p>支持度：事务集中，同时包含A和B的百分比</p>
<p>置信度：事务集中，包含A的情况下也包含B的概率</p>
<p>k-项集</p>
<p>顶集的频率：包含指定项集的事务数的占比</p>
<p>根据最小支持度阈值，找到频繁项集</p>
<p>协同过滤算法</p>
<p>新上线的推荐系统，第一个算法就是协同过滤算法</p>
<p>基于用户的协同过滤</p>
<p>假设：如果用户对一些物品的评分比较相似，那么他们对其他物品的评分也很相似</p>
<p>基于物品的协同过滤</p>
<p>假设：用户对项目的评分和用户对其他相似项目的评分很相似</p>
<p>问题：数据的稀疏性（很难找到相似用户），数据的扩展性（相似度关系代码需要很长的计算时间）</p>
<p>计算相似度</p>
<p>余弦相似度</p>
<p>修正的余弦相似性</p>
<p>相关相似性</p>
<p>评分估算公式</p>
<p>其他：内容推荐、标签推荐、社交网络推荐、位置推荐</p>
<p>半监督性学习算法：机器学习应用很多</p>
<p>一部分数据有标签，另一部分没有，用一部分有标签的数据来扩展没有标签的数据</p>
<p>3.工具</p>
<p>Python</p>
<p>工具包 Numpy Pandas Matplotlib Scipy Sklearn NLTK（自然语言处理） NetworkX</p>
<p>集成工具 Anaconda</p>
<p>参考书 《利用Python进行数据分析》《Python数据分析基础教程》《利用Python机型自然语言处理》</p>
<p>《数据挖掘导论》（一定看，翻译很烂） 《机器学习实战》 《python数据分析与挖掘实战》 《大嘴巴漫谈数据挖掘》 <a href="http://www.36dsj.com" target="_blank" rel="noopener">www.36dsj.com</a> 《数据挖掘与数据化运营实战》（比较初级） 机器学习基石（台湾大学？）</p>
<p>实际应用：过拟合（应用中过度透视数据，忽略数据的一些不可预测性）</p>

          
        
      
    </div>

    

    
    
    

    

    

    

    <footer class="post-footer">
      

      

      

      
      
        <div class="post-eof"></div>
      
    </footer>
  </div>
  
  
  
  </article>


    
      

  

  
  
  

  

  <article class="post post-type-normal" itemscope itemtype="http://schema.org/Article">
  
  
  
  <div class="post-block">
    <link itemprop="mainEntityOfPage" href="http://blog.zhengzi.me/2016/05/30/e5-a4-a7-e5-88-9b-e4-b9-b1-e8-b0-88/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="name" content="Jason Bian">
      <meta itemprop="description" content="">
      <meta itemprop="image" content="/images/avatar.jpg">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="政子的博客">
    </span>

    
      <header class="post-header">

        
        
          <h1 class="post-title" itemprop="name headline">
                
                <a class="post-title-link" href="/2016/05/30/e5-a4-a7-e5-88-9b-e4-b9-b1-e8-b0-88/" itemprop="url">
                  大创乱谈
                </a>
              
            
          </h1>
        

        <div class="post-meta">
          <span class="post-time">

            
            
            

            
              <span class="post-meta-item-icon">
                <i class="fa fa-calendar-o"></i>
              </span>
              
                <span class="post-meta-item-text">Posted on</span>
              

              
                
              

              <time title="Created: 2016-05-30 01:26:04" itemprop="dateCreated datePublished" datetime="2016-05-30T01:26:04+08:00">2016-05-30</time>
            

            
              

              
                
                <span class="post-meta-divider">|</span>
                

                <span class="post-meta-item-icon">
                  <i class="fa fa-calendar-check-o"></i>
                </span>
                
                  <span class="post-meta-item-text">Edited on</span>
                
                <time title="Modified: 2018-08-21 17:49:42" itemprop="dateModified" datetime="2018-08-21T17:49:42+08:00">2018-08-21</time>
              
            
          </span>

          
            <span class="post-category" >
            
              <span class="post-meta-divider">|</span>
            
              <span class="post-meta-item-icon">
                <i class="fa fa-folder-o"></i>
              </span>
              
                <span class="post-meta-item-text">In</span>
              
              
                <span itemprop="about" itemscope itemtype="http://schema.org/Thing"><a href="/categories/应用/" itemprop="url" rel="index"><span itemprop="name">应用</span></a></span>

                
                
                  , 
                
              
                <span itemprop="about" itemscope itemtype="http://schema.org/Thing"><a href="/categories/应用/随笔/" itemprop="url" rel="index"><span itemprop="name">随笔</span></a></span>

                
                
              
            </span>
          

          
            
          

          
          

          

          

          

        </div>
      </header>
    

    
    
    
    <div class="post-body" itemprop="articleBody">

      
      

      
        
          
            <p>最近呢，算是从大创展开始的吧。就只是上周的事儿，所想所感也忘记差不多了，无奈一直无空记载，今日有空于此一谈。 首先想到的是去年一天晚上下课纪老师推着他的“坐骑”边走边说他对项目的理解，认为大创这种机制不甚合理，非常不灵活。我假装懂了。 大创一年，最终项目勉强参与了展览，却也不怎么想去站台，什么都说不出来，能做的只是去夸我们的设计师有多厉害，其余的，我一个字都说不出。 相比之下，我乐于站在非大创项目的弹幕派这里，向大家推荐介绍。甚至即使是没有我的名字的预约系统，我也乐意跟同学们去讲解。 不止我一人，弹幕派的另一位成员志龙和我抱一样的态度，即使他的功夫道场是明星项目还得到推介。 （害怕忘记，之前想到了就和一学妹谈起这些，经其同意表达在文章中，之后的话可能是一些聊天信息的修改和摘录。） 在展会转了几遭，极好的项目（比如预约系统）到很差的项目（比如我做的智能光源）都见了一些。 记的光源完成时三月份的时候，柳絮还没有飞，天气也没有燥，还是可以做项目的好时间。杨杨眼看着项目快到终期检查，团队却早已没了，她找到了我，我应允，匆忙花了一周多将项目赶完，给纪老师签字，他很生气，只最终也心慈手软签了结题报告。不巧被评定老师认为项目非常完善（其实是杨杨UI设计很棒），被选入了大创展。我没感到开心，只是预感大创展可能会不好过。 再说弹幕。它的可用原型早在去年十月份的时候的微软Hackathon中已经做出了，之后几经开发停滞（因为各种其他事情），在寒假我和志龙将应用基本框架完成，到了今年四月份需要提交微软菁英计划的中期报告时候又将其完善了一下，前前后后虽然战线很久，却没投入太多时间来做。到了大创展，它已经是一个可以供人们自由下载使用的套件了。在去年的马拉松中，我们绝没想到今天它会变成这样。 Hackathon结束之后某天，有天碰见海洋老师。和他聊起大创作品，他表示有些担心，质量很高的项目总是不多，但学校的投入却非常巨大。有的项目到了展出还不如有的人业余时间做了两周的项目原型。 我一直不能解释到底是为什么，嗯，现在也不能。（可能许多事情并没有那么强的因果，因果只是我们为了好理解强加上去的。当然现在不该来谈论这些观点。） 我还是来强行给一个我理解说得过去的理由吧，是激励机制有问题。简单的说，一是没有相关培训，而且时间战线拉得太长；二是机制太死，非常不灵活。 第一个好说，大创项目是需要从立项到结题历经一年，一年之中什么都可能发生，可能一个团队已经换了两个方向，或者一款软件已经迭代了几十次上百次。而我们是需要用一年去做一个很可能是自己YY出的一个项目，一年的未知系数太大。学校默认团队管理者有丰富经验，指导在一年中如何管理团队。但实际上，很多团队管理者不懂得设立里程碑或者不知道如何设立里程碑，也不懂团队的激励。团队出问题，开发进度出问题，或者就是单纯的方向行不通，都可能导致项目挂掉。 第二个，就是项目机制太死，老大一直都需要提交许多无用的文字；买什么东西需要各种发票一毛钱一毛钱去对着报销；方向改变或者团队人员改变需要提交很多书面材料。其实就是对学生的不信任，说好听些是不认可。 这样矛盾来了，第一条里说学校默认学生具有相应的项目能力，在第二条里又对学生不够信任。 说说微软俱乐部项目是什么样的吧。 我们先在Hackathon上用两天时间做出了项目原型，之后会有评委和同学参与到评审之中，来帮助我们确定项目是不是合理可行，也可以听到第一批接触者宝贵的建议（而不是自己去YY），之后微软提供最高一万元（大创最高只有3K）的启动资金，在半期的时候直接打入一半的资金进入账户（没有任何报销措施，中期评定后再打入一笔）。我们在一个知道可行性并且有充分信任我们的经费的时候就可以自由去做事情，买服务器，TeamBuilding聚餐，甚至是花钱去找厉害的人做咨询都是可能的（很多买卖也都是没有发票的）。评定呢，就是一个项目说明视频，文字说明可有可无。 学妹谈到了利益问题，认为老师没有利益驱动来鼓励创新，而企业有利益驱动，大概也可以说明一部分情况，但也不只是如此。毕竟归结为利益是人们发明的一种简单的归原论，说到这里就很难去讲更大的规律格局，而是陷入了人的怪圈。 从同学的角度来看大创这个东西。大概有一部分人认为大创是目的，包括我。去年这个时候我就是认为可以在大创体制下做一个项目是一个非常有意思的事情，我却忽略了其是大创只应该是一个途径，一个做成项目的途径，而不是我做项目的目的。因此，我失去了许多跳出大创圈子思考问题的机会，也是项目失败的一个原因。 总的说，项目的发展有一定的规律，注意下面所说的点，或许可以帮助大家找到这个规律。 第一就是相信事情没有太多的因果性，做成还是失败是多个维度复杂的事件构成的一张极为丰富而复杂的网络，我们能找到的是其中看似有规律的模式，不是因果。 第二，团队管理者不能低头只顾自己做事（说好听是用自己为团队做榜样）。Leader要做的事思考团队的发展方向，给团队成员做好后勤，督促大家做事，吸引更多厉害的同学加入，等等。就是把精力注意力从自己身上移开，多投入到别人那里（这里多谢章润同学提供思路），并且了解一些简单的管理思路。 第三，使用一种迭代的思路开发产品，需要紧密同市场（就是你们的产品使用者）多进行沟通，反复迭代。（当然这里说的是创新项目，学术项目请忽略） 最后，是心态问题。抱着做事的心态来参加大创，搞清楚目的和途径。（当然，我要恭喜那些目的是为了学分或者混个balabala的人——这篇文章你白看了，对你没有任何帮助。） 我想说，上面的观点也只是个人所见，对与不对，或者有任何让人不舒服的地方，那真是太好了（而且我不负责任）。 怎么说文章也得有点儿负责任的地方，所以强行插播两则靠谱的广告： 关于我们很赞的俱乐部项目——弹幕派 先公布一下最近的的战果：时间从大创展开始（5月19日）到现在（5月30日） 微信公众号弹幕派（danmakupie）关注量从2到了104人； 有25个团队创建了弹幕派账户；有22个弹幕房间被创建，其中大创的官方弹幕房间51人发布了220条弹幕；所有的房间一共发布了近770条弹幕； 在Github中，有了4个fork和2个star，还有1个issue。 弹幕派正在快速成长，它正在被更多的人使用！ 所以——欢迎大家开始使用我们的产品——请登录 <a href="http://danmu.zhengzi.me" target="_blank" rel="noopener">danmu.zhengzi.me</a> 开始试用，有什么问题或者需求也可以直接在下方留言或者联系邮箱 <a href="mailto:danmakupie@outlook.com" target="_blank" rel="noopener">danmakupie@outlook.com</a>。 最后，再再负责任地招人——乐享其约团队（也是我们微软俱乐部的项目哟）也需要你的加入。 怎么说呢（咳咳，先严肃点儿），乐享其约团队是一个非常非常靠谱的创业团队，我们的预约产品已经广泛地被应用在许多大学（相信社团的同学在预约活动教室的时候已经体验过了），也有越来越多的公司开始采用我们的产品给客户提供预约。现在整个团队的估值也已经在百万级别，相比于很多项目，竞争力，哈哈，我不多说，你懂的。 现在我们注意到体育场馆预约很有意思（也很有钱途），所以一个微信公众号是必须有的，如果你是体育达人，身边有许多一起热爱运动的小伙伴，或者你对公众号运营非常感兴趣，那没得说，来吧！ 条件呢，有三个：第一，不是考研党（想想考研党也不会来，就当我没说）；第二，不需强求有经验（有很多大神带嘛，当然大神来带我们也非常欢迎）；第三，不能只是谈情怀，还需要收下公司股份（毕竟以后我们可是要一起在三环买别墅的人(˶‾᷄ ⁻̫ ‾᷅˵)）。 联系方式，第一，qq 676259299；第二，qq 896776703；第三，直接在下方留言 项目官网 <a href="http://www.joyreserve.com/?l=zh-cn" target="_blank" rel="noopener">http://www.joyreserve.com/?l=zh-cn</a> 就酱紫，下回见。</p>

          
        
      
    </div>

    

    
    
    

    

    

    

    <footer class="post-footer">
      

      

      

      
      
        <div class="post-eof"></div>
      
    </footer>
  </div>
  
  
  
  </article>


    
      

  

  
  
  

  

  <article class="post post-type-normal" itemscope itemtype="http://schema.org/Article">
  
  
  
  <div class="post-block">
    <link itemprop="mainEntityOfPage" href="http://blog.zhengzi.me/2016/05/16/e6-88-91-e7-9c-bc-e4-b8-ad-e7-9a-84-e9-80-9a-e4-bf-a1/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="name" content="Jason Bian">
      <meta itemprop="description" content="">
      <meta itemprop="image" content="/images/avatar.jpg">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="政子的博客">
    </span>

    
      <header class="post-header">

        
        
          <h1 class="post-title" itemprop="name headline">
                
                <a class="post-title-link" href="/2016/05/16/e6-88-91-e7-9c-bc-e4-b8-ad-e7-9a-84-e9-80-9a-e4-bf-a1/" itemprop="url">
                  我眼中的“通信”
                </a>
              
            
          </h1>
        

        <div class="post-meta">
          <span class="post-time">

            
            
            

            
              <span class="post-meta-item-icon">
                <i class="fa fa-calendar-o"></i>
              </span>
              
                <span class="post-meta-item-text">Posted on</span>
              

              
                
              

              <time title="Created: 2016-05-16 03:21:48" itemprop="dateCreated datePublished" datetime="2016-05-16T03:21:48+08:00">2016-05-16</time>
            

            
              

              
                
                <span class="post-meta-divider">|</span>
                

                <span class="post-meta-item-icon">
                  <i class="fa fa-calendar-check-o"></i>
                </span>
                
                  <span class="post-meta-item-text">Edited on</span>
                
                <time title="Modified: 2018-08-21 17:49:42" itemprop="dateModified" datetime="2018-08-21T17:49:42+08:00">2018-08-21</time>
              
            
          </span>

          
            <span class="post-category" >
            
              <span class="post-meta-divider">|</span>
            
              <span class="post-meta-item-icon">
                <i class="fa fa-folder-o"></i>
              </span>
              
                <span class="post-meta-item-text">In</span>
              
              
                <span itemprop="about" itemscope itemtype="http://schema.org/Thing"><a href="/categories/通信/" itemprop="url" rel="index"><span itemprop="name">通信</span></a></span>

                
                
                  , 
                
              
                <span itemprop="about" itemscope itemtype="http://schema.org/Thing"><a href="/categories/通信/随笔/" itemprop="url" rel="index"><span itemprop="name">随笔</span></a></span>

                
                
              
            </span>
          

          
            
          

          
          

          

          

          

        </div>
      </header>
    

    
    
    
    <div class="post-body" itemprop="articleBody">

      
      

      
        
          
            <p>想来已学通信三载之久，却也未习得多少皮毛。在此，我想将自己这几年来对通信的浅见写下一二。文中可能会有一些观点但我可能因为能力精力有限无力举出太多示例论述之，之后有能力和时间我会在blog中给予补充说明。如果文中有不对地方，希望可以给予批评指正，我不胜荣幸。</p>
<h1 id="缘起"><a href="#缘起" class="headerlink" title="缘起"></a>缘起</h1><p>小时候，爷爷有一台自制的电子管收音机，虽然已经年久失修无法使用，但是我还是以此为乐，经常想看看摸摸，问爷爷里面的构造。有时候还会从外面捡回家别人废弃的电路板，把零件拆下来看，爷爷用我拆下来的这些零件修好了很多家电。 家里第一次上网，刚可以访问google的时候，我非常兴奋，就拿起modem的线，想看看拨号连接的时候会有什么变化发生。可是没有发现任何变化，只知道了电话线里面有电，来电话的时候摸的话会被打得很痛。回想起来，那应该是我第一次对通信提起兴趣。 到了高中，一次偶然机会，我接触到了《无线电》杂志。看着里面的各种稀奇古怪的电路原理图，虽然很晕，但好奇心还是强迫我去了解这到底是什么原理。从志鹏那里得到了一本《小功率的力量》，还从他那里学习到了基尔霍夫定律和一些交流电的相量算法，但是那时候不怎么看懂微积分，所以只照猫画虎马马虎虎做过一个简单的无线电收发器，拿去跟朋友玩，发现只能听见模模糊糊的声音，根本不知道对方是谁更不知道说的是什么。 之后，我又自学了C语言，碰巧又在《无线电》中看到了有关51单片机和Arduino的介绍，发现了使用软件编程方式来实现硬件逻辑会如此简单，也明白了原来通信还有遵循章法——通信协议（比如串口通信和IIC协议）。 中学生活愉快地结束之后，志愿不怎么犹豫就填写了北京邮电大学的通信工程专业。 那时候，想法很天真，认为通信就是可以愉快地学习电路原理，做个芯片啥的，知道怎么把信息传给别人，还可以写出来像QQ一样厉害的软件。 回忆赘述地有些多，不过亦可以作为一个对比，看看这几年我到底有何长进。 下文我想就我见到的几个方面来说说现在我眼中看见的通信。</p>
<h1 id="“考古”信息和通信"><a href="#“考古”信息和通信" class="headerlink" title="“考古”信息和通信"></a>“考古”信息和通信</h1><p>许多时候提起通信，大家会认为这是一个近代社会，特别是电报发明之后才有的事情。如果说可以想得更远一些，那么很可能会想到古时候还有书信、飞鸽传书甚至还有烽火戏诸侯。 可是追溯到这里就应该停止了么？我先说说我理解的通信，再继续沿着历史的脉络去溯源。 我看来，通信就是通过某种媒质（信道）将某种信息从信源传到信宿的一个过程。 现在来思考更早之前的古人都做了些什么。</p>
<h2 id="八卦"><a href="#八卦" class="headerlink" title="八卦"></a>八卦</h2><p>八卦相传起源于伏羲，他通过八卦代表的”阴阳五行”的推演关系来解释这个世界。如果熟悉二进制的话，由八卦中的”8”可以很快联想到。观察八个卦象，果不其然，卦象都是由三位二进制的符号表示而来，这不就是一个原始的三八译码器？而卦象的推演，和lambda演算有些相似，所以这不也就可以将八卦理解为一个原始的图灵机么？所以八卦的本质是计算，作为卦象，也就是作为二进制信号，是当时人们发明的一种信息记录的手段。</p>
<h2 id="结绳记事"><a href="#结绳记事" class="headerlink" title="结绳记事"></a>结绳记事</h2><p>在文字发明之前，古人已经想到了用结绳记事的形式来表示信息，他们用不同的绳结表示不同的含义，已经可以将现实中的事物转化为抽象的符号表示。 那怎么完成通信呢？很简单，信道就是视距的光线传播。大家都看一眼那根绳子，就知道之前发生了什么事情，比如打到了几头野兽，部落里现在还有多少人。这不也是一种更加古老的通信方式？ 在这里，我必须要感谢纪阳老师的一节课上他在时空的维度上对我对通信的认识进行的启发。</p>
<h2 id="更多的发现——社会的发展与通信的关系"><a href="#更多的发现——社会的发展与通信的关系" class="headerlink" title="更多的发现——社会的发展与通信的关系"></a>更多的发现——社会的发展与通信的关系</h2><p>每次人类的发展无不伴随着通信的进展，说得更深入一些，是通信所带来的连接的进展，这是一个有趣现象。 可以观察到，先秦诸子百家争鸣的时候，人们的连接水平（也可以说是通信方式）较之以前，已经有了一些进展，人们可以乘坐交通工具（比如马车）进行大范围迁徙（全国范围），借此，有许多文人可以四处游学传播思想，思想之间的到碰撞，产生了许多哲学观点，构建了中华文明世界观和价值观的基础。 再来看看近一些的事情，大航海时代，西班牙人跨过大洋，走向了世界各地，将信息传播的范围扩展到了全球，人们知道了国家以外还有许多文明的存在，于是刺激了商业贸易，和殖民主义，客观上加强了文化的传播与交流，创造了长达将近两百年的繁荣的时代。现在，信息的传播已经从大陆内部迁移到了更广阔的大陆之间。将更多的人拉入了一个协作之网。 之后的第一次工业革命，机器印刷品让信息的保存传播范围更广，失真更小；第二次工业革命发明的电报电话更是将整个世界联系成为了一个紧密的协作共同体，使得跨国公司成为了可能，这促使了人类工业文明的极大进步。 到了现在，全球的互联网用户已经超过了33亿，大约占全球人口的一半，这个是多么恐怖的一个数字！将如此多的人拉入了一个全球协作的大网之中，人与人之间的交流共同变得极为便捷，生产力得到前所未有的解放和发展。 通信与发展孰因孰果我不确定，但我更愿意相信是通信技术和距离的不断发展，引领了人类社会的发展，创造了如此多的价值和财富。</p>
<h1 id="网络"><a href="#网络" class="headerlink" title="网络"></a>网络</h1><p>提到现代通信，不得不说的事情就是网络。我想这是我们现代通信人为全世界各行各业做出的一个不可磨灭的贡献。在我看来，互联网如今的发展，并不是一般认为的我们通信行业遭受了前所未有的打击，而是一次绝好的发展机遇。</p>
<h2 id="连接红利与传统通信行业"><a href="#连接红利与传统通信行业" class="headerlink" title="连接红利与传统通信行业"></a>连接红利与传统通信行业</h2><p>前文所述，随着人类连接水平的不断发展，人们的各行各业都在享受着连接所带来的巨大红利，互联网第一次把几乎整个人类社会拉入了一个全球共同协作的大网中，我们的通信行业更是如此，在发展的前几年，获取了巨大红利。中国移动已经跻身世界五百强第55名，中国电信位于第154名，AT&amp;T位于第34名，沃达丰位于141名（2015年7月数据），所以，在商业世界中，传统通信企业有自己一片不小的领地。 但是，传统通信运营商的排名为何不在最前呢？排名最前的依旧是能源和金融企业。我看来，是因为通信行业提供的基础网络支持是连接的一个基础设施，当基础设施建设基本成型之后，其产生的巨大价值会被各行各业加以利用，因为稍加利用得到非常大的链接红利（从硅谷和中关村互联网创业浪潮中可见一斑）。但是基础设施建设的企业因为并未完全利用其自己搭建的基础设施，所以并不能从中得到很高的利润。比如说，在第二次工业革命中，美国铁路的建设带来了巨大的链接红利，但是最终铁路公司并没有获取最大的利润，而是依旧让能源与金融巨头夺得风头。而现在微信的快速发展以及前几年和运营商之间因利益分成不均导致的冲突也是一个很好的例证。 所以对于所谓的传统运营商，我想可能有两种办法来解决现在存在的问题。 第一，缩小业务范围，放弃一些获利较少的业务（比如语音通信和短消息），将这些顶层业务交给虚拟运营商，将自己变成一个提供专业通信连接解决方案的寡头，利用资金和成本优势，建立大型的数据和交换中心，依靠其他企业在自己平台上的发展，以获取利润；另外，可以加速自己的转型，利用广大的用户基数，形成一种具有”无处不在”优势的面向企业的内容分发平台，并提供数据支持和分析业务。 在我看来，第一种思路虽然有些保守，但在一个自己拿手的细分领域完成这次转变会更容易成功。</p>
<h2 id="网络性质与跨学科应用"><a href="#网络性质与跨学科应用" class="headerlink" title="网络性质与跨学科应用"></a>网络性质与跨学科应用</h2><p>互联网给世界的另一大贡献就是将一个人为可控而且鲁棒性好的网络摆在了科学家们面前。 以前许多无法研究的网络问题，现在可以通过计算机模拟的方法研究；甚至互联网不仅仅本身是一个大的物理网络，它更是由许许多多大大小小的逻辑网络组成，这些逻辑网络虽然性质各异，但都符合网络的基本规律。 一些社会学、经济学、表面物理学、分子生物学的问题，归结起来都是网络问题。但是因为之前没有很好的工具去跟踪定量地研究，所以只能不断去研究分解论，对于还原论的研究没有很好的工具和理论支持。但现如今，有了这个非常方便科学研究的庞大的互联网络，让许多网络的客观规律呈现在科学家面前，层出不穷的网络模型和分析方法就是很好的证明。对这些模型和规律加以推广和外延，就可以在交叉学科得到应用，这是多么美妙的一件事情。</p>
<h3 id="幂律"><a href="#幂律" class="headerlink" title="幂律"></a>幂律</h3><p>我认为幂律是网络研究中一个无法回避的问题。 人们从无尺度网络模型中意识到了幂律在网络中的存在。不论是每个网络站点的连接数或者是某条新闻的访问量以及社交网络的关注人数，都符合此规律。更广泛地，在任何一个无标度的网络之中，都会出现幂律现象。比如在商业竞争中，公司的市场占有份额中，幂律（亦称80/20法则）有着非常明显地体现；而地震规模大小的分布（古登堡-里希特定律）居然也符合此规律。 表面看起来两个活动（一个是人为的经济活动，一个自然的地质活动）几乎没有关联，但仔细思考，这两种活动皆是许许多多的因素（节点）一同构建成为一个复杂网络进行协作的结果，不论是否有人参与，规律都摆在那里，不为所动。</p>
<h3 id="相关性"><a href="#相关性" class="headerlink" title="相关性"></a>相关性</h3><p>互联网带给科学研究视角的另一个转变就是从追求因果到追求相关性。 在很长一段时间，人们都相信世界中万物都是强因果关系（大概可能是从鬼神的传说开始到宗教时代再到以近代科学为支撑的社会都是如此）。不论是那种现象，都需要有一个因果解释。 但是网络因为其复杂程度，很难分析出（也可能根本没有）许多事件发生因果关系，但是可以找到许多事件都有非常大的相关性（一般指的是线性相关）。越来越多的相关性信息摆在人们面前，人们对世界的看法很可能也在一点点地发生转变。 没错，买雪糕的小女孩的收入和游泳馆人数是正相关的关系，可能有许多版本的因果解释，我们无法真正确定究竟哪种版本是对的，但相关的事实就摆在那里。所以现代借助统计学的方法进行的大数据分析多是在相关关系的基础上进行的，我们靠着这一思维的转变，得到了不少有用的结论。 就实用性而言，相关关系的确似乎更加实用（这里用似乎也是因为只是具有相关性而非因果性），就人们的思维观念而言，转变可能就在不知不觉中悄然发生。</p>
<h1 id="信息理论"><a href="#信息理论" class="headerlink" title="信息理论"></a>信息理论</h1><h2 id="我眼中的《信息论》和《信号与系统》"><a href="#我眼中的《信息论》和《信号与系统》" class="headerlink" title="我眼中的《信息论》和《信号与系统》"></a>我眼中的《信息论》和《信号与系统》</h2><p>在这几年的课程中，对我世界观和思维方式影响最大的两门课程莫过于《信息论》和《信号与系统》。 我对《信息论》的认识自认非常浅显。在我的理解中，信息是一种概率存在（它是客观存在，而不是主观定义的），可以进行量化。并且根据香农公式，我们的信息最大传输速率和信道容量与信噪比存在数学和物理上的约束关系，不能无限提升。我们能做的事情，就是找出信息这种概率存在的存在形式的规律和不断逼近香农的信道容量曲线。 我对《信号与系统》的理解也只是在:只要信号和经过的系统可以近似等效为线性，那么我们就可以在时域或者变换域（信号和系统的存在不仅仅是时间，还在频率）求解信号和系统在不同域值时的不同性质。并且信号和它所经历所有的转换都可以看作是种一组线性方程在一个线性系统构成的线性空间内进行的一系列线性转换。它也打开了物理世界和数学世界之间相通的大门。 我的认识虽然还非常浅显，但我已然被前人的智慧深深地震撼。我想，随着我长年累月的思考，我的理解可能会越来越深刻。</p>
<h2 id="信息场"><a href="#信息场" class="headerlink" title="信息场"></a>信息场</h2><p>根据我少得可怜的物理知识看来，将信息类比成熵，是说明了两点：信息具有传播方向，信息传播不可逆。如此看来，将信息比作一个”场”会不会也可以解释些什么？ “场”从定义上看来，场是用来描述物理量在空间上的分布而被定义的。从分布上来说，场都有一个场源，而场中其他的物质和它的相互作用的规律就是它所产生的场的规律。 那么假设信源作为一个场源，而所有信道之和就是场所表示的空间，最后信宿就是场中的可以与信源相互作用的物质。 那么按照这样的推理，会有什么样的结果呢？ 首先，信息场是可以测量的，而且它有物质属性。我们可以知道信源的信息量，再测量信宿所得到的信息量，相减之后，就可以得到信道中损失的信息量，那么如果这个信道的性质不变，信息量的衰减规律也不会改变。 然后，由上面推测，可以得出信息场具有衰减性。信息场的衰减系数可能与信道和信源的性质有关。 通过上面两条推理，可以发现信息场可以类比引力场作为一个有散无旋场。 那么，信息场可能会像重力场一样具有势能场强。我猜想信息势能可能符合平方反比规律。 但是限于数学知识的匮乏，以上的推理我都无法建立一个可用的数学模型进行印证并且进行演算证明。 如果以上的推理成立，那么也就印证了信息的物质属性，那么它是否可以同质量和能量去转换，形成一个更大的统一场，我已经无法继续思考下去。 我不知这样的思考是否有理可依。放在这里，当是呓语罢了。</p>
<h1 id="发展"><a href="#发展" class="headerlink" title="发展"></a>发展</h1><p>最后，我还想再大胆猜猜以后通信会如何去发展。 先说出一个自己的观点:通信的发展是人类社会不断发展中，社会分工不断细化而不得不出现的一个代偿性的结果。 我来解释一下：因为事物的发展是按照一定方向的，按照一个系统演进的规律可归纳总结出人类社会的发展方向是朝着从集体主义但每个人的存在都很独立，向个人主义但每个人的存在都需要依存于大量的社会关系而发展的。每个人的价值越来越得到重视，但是每个人的社会分工也越来越被细化，人与人之间的知识分割和思维分割越来越大，为了维系人类社会连接这张大网的存在，就必须要有通信不断地快速发展，使得人与人之间可以通过一种途径在各种感官层面直连起来，而代偿原来的社会那样人与人之间没有什么联系就可以拥有人类共通的基础认识的情况。所以，通信一定会发展得越来越快，在社会中的地位也会越来越重要。但是不论通信如何发展，社会可能再也无法像原来那样因为人类的知识量很小而不用怎么连接就可以拥有相似的共通知识作为共通的认知而维系住这张人类社会关系的网络。最后很可能会因为网络失衡导致很多的社会问题。 当然这些猜想可能都是很久以后的事情了。 就最近而看，因为我没有深入一线通信产业，所以可能无法看个究竟，只是认为一点：硬件的软件化可能是现在的通信运营商的一个演进方向。 让网络硬件设备可以编程控制。这一努力可能会让许多本来属性与作用不同的网络被重新组合在一起，形成一套通用的运行环境。划分网络和网络管理的形式将由以前的必须通过通信设备的更迭来解决的问题变为只需通过通用的软件配置就可以解决的问题。</p>

          
        
      
    </div>

    

    
    
    

    

    

    

    <footer class="post-footer">
      

      

      

      
      
        <div class="post-eof"></div>
      
    </footer>
  </div>
  
  
  
  </article>


    
  </section>

  
  <nav class="pagination">
    <a class="extend prev" rel="prev" href="/page/4/"><i class="fa fa-angle-left" aria-label="Previous page"></i></a><a class="page-number" href="/">1</a><span class="space">&hellip;</span><a class="page-number" href="/page/4/">4</a><span class="page-number current">5</span><a class="page-number" href="/page/6/">6</a><span class="space">&hellip;</span><a class="page-number" href="/page/9/">9</a><a class="extend next" rel="next" href="/page/6/"><i class="fa fa-angle-right" aria-label="Next page"></i></a>
  </nav>



          </div>
          

        </div>
        
          
  
  <div class="sidebar-toggle">
    <div class="sidebar-toggle-line-wrap">
      <span class="sidebar-toggle-line sidebar-toggle-line-first"></span>
      <span class="sidebar-toggle-line sidebar-toggle-line-middle"></span>
      <span class="sidebar-toggle-line sidebar-toggle-line-last"></span>
    </div>
  </div>

  <aside id="sidebar" class="sidebar">
    
    <div class="sidebar-inner">

      

      

      <section class="site-overview-wrap sidebar-panel sidebar-panel-active">
        <div class="site-overview">
          <div class="site-author motion-element" itemprop="author" itemscope itemtype="http://schema.org/Person">
            
              <img class="site-author-image" itemprop="image"
                src="/images/avatar.jpg"
                alt="Jason Bian" />
            
              <p class="site-author-name" itemprop="name">Jason Bian</p>
              <p class="site-description motion-element" itemprop="description"></p>
          </div>

          
            <nav class="site-state motion-element">
              
                <div class="site-state-item site-state-posts">
                
                  <a href="/archives/">
                
                    <span class="site-state-item-count">86</span>
                    <span class="site-state-item-name">posts</span>
                  </a>
                </div>
              

              
                
                
                <div class="site-state-item site-state-categories">
                  
                    
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                    <span class="site-state-item-count">41</span>
                    <span class="site-state-item-name">categories</span>
                  
                </div>
              

              
                
                
                <div class="site-state-item site-state-tags">
                  
                    
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                    <span class="site-state-item-count">109</span>
                    <span class="site-state-item-name">tags</span>
                  
                </div>
              
            </nav>
          

          

          

          
          

          
          

          
            
          
          

        </div>
      </section>

      

      

    </div>
  </aside>


        
      </div>
    </main>

    <footer id="footer" class="footer">
      <div class="footer-inner">
        <div class="copyright">&copy; <span itemprop="copyrightYear">2018</span>
  <span class="with-love" id="animate">
    <i class="fa fa-user"></i>
  </span>
  <span class="author" itemprop="copyrightHolder">Jason Bian</span>

  

  
</div>




  <div class="powered-by">Powered by <a class="theme-link" target="_blank" href="https://hexo.io">Hexo</a></div>



  <span class="post-meta-divider">|</span>



  <div class="theme-info">Theme – <a class="theme-link" target="_blank" href="https://theme-next.org">NexT.Gemini</a></div>




        








        
      </div>
    </footer>

    
      <div class="back-to-top">
        <i class="fa fa-arrow-up"></i>
        
      </div>
    

    
	
    

    
  </div>

  

<script type="text/javascript">
  if (Object.prototype.toString.call(window.Promise) !== '[object Function]') {
    window.Promise = null;
  }
</script>


























  
  
    <script type="text/javascript" src="/lib/jquery/index.js?v=2.1.3"></script>
  

  
  
    <script type="text/javascript" src="/lib/velocity/velocity.min.js?v=1.2.1"></script>
  

  
  
    <script type="text/javascript" src="/lib/velocity/velocity.ui.min.js?v=1.2.1"></script>
  


  


  <script type="text/javascript" src="/js/src/utils.js?v=6.4.0"></script>

  <script type="text/javascript" src="/js/src/motion.js?v=6.4.0"></script>



  
  


  <script type="text/javascript" src="/js/src/affix.js?v=6.4.0"></script>

  <script type="text/javascript" src="/js/src/schemes/pisces.js?v=6.4.0"></script>



  

  


  <script type="text/javascript" src="/js/src/bootstrap.js?v=6.4.0"></script>



  



  










  





  

  

  

  

  
  

  

  

  

  

  

</body>
</html>
